要写入Array的多个线程

时间:2013-01-20 01:18:43

标签: c# multithreading thread-safety

所以它在C#中,基本上我会在每个线程的数组中有一个位置来存储一些数据。我需要锁定吗?例如:

int[] threads = new int[12];

每个线程都会访问数组中的特定位置,例如,线程1将更新线程[0],线程2线程[1]等中的值。

想法是让控制台打印存储在数组中的值。

好的,有很多评论。我想我会澄清我正在做的事情,希望我能学到更多。所以基本上它的要点是:

主线程开始12个独立的线程,每个线程调用主线程中的一个函数从数据库中获取一堆记录。对该方法的访问被锁定,但它返回大约100条记录,供线程自行处理。

当线程处理记录时,它会产生一些Web请求并插入到数据库中。一旦线程处理完一批记录,它就会从主线程中再次调用一个函数,该函数将启动一个新线程,代替最后一个完成的线程。

当线程正在进行处理时,我想在控制台中输出它们的进度。最初我锁定了每个控制台输出,因为如果同时调用相同的函数,每个输出的光标位置将遍布整个地方。所以我想我会有一个数组存储每个值的计数,然后有一个函数只打印出来。虽然我开始怀疑这与我目前正在做的有什么不同。

2 个答案:

答案 0 :(得分:4)

如果每个线程都在自己的索引处访问一个值,那么你应该没问题,因为你不必担心同时从多个线程访问。

答案 1 :(得分:2)

我相信如果每个线程只在阵列的一个单独部分上工作,那么一切都会很好。如果您要共享数据(即在线程之间进行通信),那么您将需要某种内存屏障来避免内存模型问题。

我相信如果你产生了一堆线程,每个线程都填充了它自己的数组部分,那么等待所有这些线程完成使用Thread.Join,这就完成了障碍。为了你的安全。

MSDN documentation on Arrays说:

  

公共静态(在Visual Basic中共享)   这种类型的成员是线程安全的。   任何实例成员都不是   保证是线程安全的。

     

此实现不提供   synchronized(线程安全)包装器   数组;但是,.NET Framework   基于Array的类提供了它们   自己的同步版本   使用SyncRoot进行收集   属性。

     

通过集合枚举是   本质上不是线程安全的   程序。即使是收藏品   同步,其他线程仍然可以   修改集合,这会导致   枚举器抛出异常。   确保螺纹安全   枚举,你可以锁定   整个收集   枚举或捕获异常   由其他人做出的改变   线程。

所以不,他们不是线程安全的。通常,当并发访问可能在内部失败时,集合被称为“非线程安全”,但是由于每个线程将访问不同的位置,因此这里没有并发访问。