多个线程访问相同的多维数组

joh*_*son 7 c# multithreading

可能重复:
C#数组是否安全?

我已经为C#编程了10个月了.我现在正在学习多线程,似乎工作得很好.我有多维数组

string[,] test = new string[5, 13]; 
Run Code Online (Sandbox Code Playgroud)

我有线程调用方法,最终将其输出保存到上面数组内的不同坐标.没有任何一个线程写入与另一个线程相同的位置.

所以thread1可能会写入test[1,10]但没有其他线程会写入test[1,10]

我的问题是:我已经读过关于在我的数组之类的对象上使用锁,我是否必须担心锁,即使我的线程可能同时访问测试数组但从不写入相同的坐标(内存位置) ?

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

Ser*_*rvy 8

如果您可以确保没有两个线程会尝试读取或写入同一个元素,那么您就不需要进行任何锁定,如果添加锁定,则会降低代码速度.

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

更新:许多其他海报继续建议锁定仅用作未来开发人员防止错误的保护措施.为此,它实际上取决于您的应用程序.如果性能确实不是问题,那么请确保继续并同步对元素的访问.

但是,多线程访问单个阵列的大多数时间存在多个线程的原因是对大量数据执行并行处理,其中性能是一个重要问题.如果它不是一个值得关注的问题,那么你可以使用一个单独的线程,并且可以更轻松地避免被其他人搞砸.在这种高性能计算中,通常尽可能地减少对锁(以各种形式)的依赖.通过分离数据进行同步(意味着防止它们读取/写入相同的存储器位置)远远优于使用锁定,当它可行时.