所以它在C#中,基本上,我将在数组中为每个线程提供一个位置来存储一些数据。我需要锁这个吗?例如:
int[] threads = new int[12];每个线程将访问数组中的特定位置,例如,线程1将更新线程中的值、线程2 threads1等。
想法是让控制台打印存储在数组中的值。
好吧有这么多的评论。我想我会澄清我到底在做什么,希望我能学到更多。从根本上讲,它的主旨是:
主线程启动12个单独的线程,每个线程在主线程中调用一个函数,从数据库中获取一堆记录。对该方法的访问被锁定,但它返回大约100条记录供线程自行处理。
当线程处理记录时,它会发出一些web请求并插入到数据库中。一旦线程完成了它的批记录处理,它就会再次从主线程调用一个函数,该函数将启动一个新线程来代替正在完成的最后一个线程。
在线程进行处理时,我想在控制台中输出它们的进度。最初,我锁定了每个控制台输出,因为如果同时调用相同的函数,则每个输出的游标位置将被整个位置覆盖。所以我想我应该有一个数组来存储每个值的计数,然后让一个函数把它全部打印出来。虽然我开始怀疑这是否真的会与我目前所做的有任何不同。
发布于 2013-01-20 01:24:37
我相信,如果每个线程只在数组的一个单独部分上工作,那么一切都会好的。如果您要共享数据(即在线程之间进行通信),那么您将需要某种内存屏障来避免内存模型问题。
我相信,如果您生成了一组线程,每个线程都填充自己的数组部分,那么等待所有这些线程使用Thread.Join完成,这将为您提供足够的安全屏障。
关于数组的MSDN文档说:
这种类型的公共静态(在Visual中共享)成员是线程安全的。不保证任何实例成员都是线程安全的。 此实现没有为数组提供同步(线程安全)包装;但是,基于数组的.NET框架类使用SyncRoot属性提供自己的集合同步版本。 枚举集合本质上不是一个线程安全的过程。即使在同步集合时,其他线程仍然可以修改集合,这将导致枚举数抛出异常。要确保枚举期间的线程安全,可以在整个枚举期间锁定集合,或者捕获其他线程所做更改导致的异常。
所以不,他们不是线安全。通常,当并发访问可能在内部失败时,集合被称为“非线程安全”,但由于每个线程将访问不同的位置,因此这里没有并发访问。
发布于 2013-01-20 01:21:12
如果每个线程都在自己的索引上访问一个值,那么您应该会很好,因为您不必同时担心来自多个线程的访问。
https://stackoverflow.com/questions/14420764
复制相似问题