因此,它在C#中,基本上我会有一个数组中的位置为每个线程存储一些数据。我需要锁定吗?例如:多个线程写入阵列
int[] threads = new int[12];
每个线程将访问阵列例如在一个特定的位置时,线程1将更新线程的值[0],线程2个线程[1],等等
思想是让控制台打印存储在数组中的值。
好吧有这么多评论。我想我会澄清我在做什么,希望我会学到更多。所以基本上它的要点是:
主线程启动12个独立的线程,每个线程在主线程中调用一个函数来从数据库中获取一堆记录。对该方法的访问被锁定,但它返回大约100条记录供线程自行处理。
当线程正在处理记录时,它会发出几个Web请求并插入到数据库中。一旦线程完成了一批记录的处理,它就会再次从主线程调用一个函数,并且该函数将启动一个新线程来代替最后一个正在完成的线程。
由于线程正在做他们的处理,我想在控制台中输出他们的进度。最初我锁定了每个控制台的输出,因为如果同时调用同一个函数,每个输出的光标位置将遍布整个地方。所以我想我会有一个数组存储每个值的计数,然后有一个函数将它全部打印出来。尽管我开始怀疑这是否与我目前所做的完全不同。
请注意,由于[错误分享](https://en.wikipedia.org/wiki/False_sharing),这可能是无效的。除非你非常清楚**你正在做什么,否则将多个线程写入通用对象(并发集合除外)永远不是一个好主意。你应该重构你的程序流程,这样就没有必要。 –
我非常同意@KonradRudolph在这里 - [见我给另一个SO的答案](http://stackoverflow.com/questions/12390468/multithreading-slower-than-singlethreading/12390662#12390662)OP描述的情况其中多线程应用程序比单线程版本慢(包括一个非常好的链接到一个优秀的MSDN文章)。我这样做并不是为了获得新答案 - 但是因为这是一个很少被人理解的现象,人们越多越好:) –
这些家伙是对的。这闻起来很可怕。记住,你应该像对待员工那样对待线索:他们很贵,所以不要雇用他们,除非你有很多工作要做。那些线程将大部分时间都闲置,等待数据库。如果你期待12封信,你会雇用12位秘书在邮箱旁等待吗?除非他们使你的处理器达到最大化,否则不要创建线程,也不要制造比处理器更多的线程。 –