多个线程访问同一多维数组

本文关键字:数组 访问 线程 | 更新日期: 2023-09-27 18:23:52

可能重复:
C#数组是线程安全的吗?

我已经为C#编程10个月了。我现在正在学习多线程,并且似乎工作得很好。我有像这样的多维阵列

string[,] test = new string[5, 13]; 

我有调用方法的线程,这些方法最终将它们的输出保存到上面数组中的不同坐标。而没有任何一个线程写入与另一个线程相同的位置。

因此thread1可能会写入test[1,10],但其他线程永远不会写入test[1,10]

我的问题是:我读过关于在像我的数组这样的对象上使用锁的文章,即使我的线程可能同时访问测试数组,但永远不会写入相同的坐标(内存位置),我也必须担心锁吗?

到目前为止,在我的测试中,我还没有遇到任何问题,但如果有比我更老练的人知道我可能会遇到问题,那么我会研究使用锁。

多个线程访问同一多维数组

如果您可以确保没有两个线程试图读取或写入同一个元素,那么您就不需要进行任何锁定,如果您添加了锁定,那么您的代码就会变慢。

然而,您应该花时间添加适当的注释来解释,(可能还有为什么)没有线程访问相同的元素,以避免Jim Fell在回答中提到的未来问题。

更新:许多其他海报继续建议,锁定只是为了防止未来开发人员出错。为此,这实际上取决于您的应用程序。如果性能真的不是什么大问题,那么当然,继续同步对元素的访问。

然而,在大多数情况下,多个线程访问单个数组——存在多个线程的原因是对大量数据执行并行处理,其中性能是一个重要问题。如果这不是一个很大的问题,那么你可以只使用一个线程,并且更轻松地避免被其他人搞砸。在这样的高性能计算中,通常尽可能减少对锁(各种形式)的依赖。在可行的情况下,通过数据分离进行同步(意味着防止它们读取/写入相同的内存位置)远优于使用锁。

需要注意的一件事是,如果您使用单核处理器进行测试,一切都可能正常工作,但一旦您在多核处理器上运行,就会遇到线程同时访问共享内存的问题。

为了安全起见,如果这两个线程实际上直接修改了您的多数组,那么您需要实现一个锁定系统。StackOverflow中的这个答案有一个很好的锁定示例。

您应该使用锁语句来确保您的数据对象是线程安全的。它现在可能可以工作,但以后(尤其是当/如果代码更新时)您(或您的回复者)可能会遇到难以捉摸的竞争条件或数据损坏错误。请查看MSDN网站上的这篇文章。它有一个关于如何使用锁语句的好例子。

锁仅用于防止同时访问。所以,如果你以其他方式保证,你就不需要锁了。

附言:我想你已经为每个数组元素分配了每个线程,对吧?