我已经为C#编程了10个月了。我现在正在学习多线程,似乎工作得很好。我有像
这样的多维数组string[,] test = new string[5, 13];
我有线程调用方法,最终将输出保存到上面数组内的不同坐标。没有任何一个线程写入与另一个线程相同的位置。
所以 thread1 可能会写入test[1,10]
,但其他任何线程都不会写入test[1,10]
我的问题是:我已经读过关于在我的数组之类的对象上使用锁,我是否必须担心锁,即使我的线程可能同时访问测试数组但从不写入相同的坐标(记忆位置)?
到目前为止,在我的测试中我没有遇到任何问题,但是如果有人比我更熟悉我知道我可能有问题,那么我会研究使用锁。
答案 0 :(得分:7)
如果您可以确保没有两个线程会尝试读取或写入同一个元素,那么您就不需要进行任何锁定,如果添加锁定,则会降低代码速度。
然而,您应该花时间添加适当的注释,以解释为什么没有线程访问相同的元素,以避免Jim Fell在答案中提到的未来问题。
更新:许多其他海报继续建议锁定仅用作未来开发人员防止错误的保护措施。为此,它实际上取决于您的应用程序。如果性能确实不是问题,那么请确保继续并同步对元素的访问。
但是,多线程访问单个阵列的大多数时间存在多个线程的原因是对大量数据执行并行处理,其中性能是一个重要问题。如果它不是一个值得关注的问题,那么你可以使用一个单独的线程,并且可以更轻松地避免被其他人搞砸。在这种高性能计算中,通常尽可能地减少对锁(以各种形式)的依赖。通过分离数据进行同步(意味着防止它们读取/写入相同的内存位置)远远优于使用锁定,这是可行的。
答案 1 :(得分:1)
要注意的一件事是,如果您使用单核处理器进行测试,一切都可能正常工作,但只要您在多核处理器上运行,就会遇到线程遇到共享内存的问题在同一时间。
为了安全起见,如果两个线程实际上直接修改了多个阵列,则需要实现一个锁定系统。 This answer in StackOverflow有一个很好的锁定示例。
答案 2 :(得分:0)
您应该使用lock语句来确保您的数据对象是线程安全的。它现在可能正在运行,但是稍后(特别是当/如果代码更新时)您(或您的替换)可能会遇到难以捉摸的竞争条件或数据损坏错误。 Check out this article on the MSDN website。它有一个很好的例子来说明如何使用锁语句。
答案 3 :(得分:-1)
锁仅用于防止同时访问。所以,如果你以其他方式保证它,你就不需要锁。
P.S。我想你已经为每个数组元素分配了每个线程,对吗?