Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 要写入阵列的多个线程_C#_Multithreading_Thread Safety - Fatal编程技术网

C# 要写入阵列的多个线程

C# 要写入阵列的多个线程,c#,multithreading,thread-safety,C#,Multithreading,Thread Safety,所以它在C#中,基本上我会在数组中为每个线程设置一个位置来存储一些数据。我需要锁这个吗?例如: int[] threads = new int[12]; 每个线程将访问数组中的特定位置,例如,线程1将更新线程[0]中的值,线程2将更新线程[1]中的值,等等 想法是让控制台打印存储在数组中的值 好吧,我收到了很多评论。我想我会澄清我到底在做什么,希望我能学到更多。所以基本上它的要点是: 主线程启动12个独立的线程,每个线程调用主线程中的一个函数以从数据库中获取一组记录。对该方法的访问被锁定,但它

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

int[] threads = new int[12];
每个线程将访问数组中的特定位置,例如,线程1将更新线程[0]中的值,线程2将更新线程[1]中的值,等等

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

好吧,我收到了很多评论。我想我会澄清我到底在做什么,希望我能学到更多。所以基本上它的要点是:

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

当线程处理记录时,它会发出几个web请求并将其插入数据库。一旦线程处理完它的一批记录,它就会从主线程再次调用一个函数,该函数将启动一个新线程来代替最后一个正在完成的线程


由于线程正在进行处理,我希望在控制台中输出它们的进度。最初,我锁定了每个控制台输出,因为如果同时调用同一个函数,每个输出的光标位置就会到处都是。所以我想我应该有一个数组来存储每个值的计数,然后有一个函数来打印所有的值。尽管我开始怀疑这是否真的与我目前所做的有所不同。

如果每个线程都在访问自己索引中的值,那么您应该不会有问题,因为您不必担心同时从多个线程访问。我相信如果每个线程只在阵列的一个单独部分上工作,一切都会好起来的。如果要共享数据(即在线程之间进行通信),则需要某种内存屏障来避免内存模型问题

我相信,如果您生成了一组线程,每个线程都填充了数组中自己的部分,然后等待所有这些线程完成使用
Thread.Join
,这将为您提供足够的安全屏障

说:

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

此实现不提供 的同步(线程安全)包装器 阵列;然而,.NET框架 基于数组的类提供了它们的 自己的同步版本的 使用SyncRoot 财产

在集合中枚举是不正确的 本质上不是线程安全的 程序即使是在收集 已同步,其他线程仍可以 修改集合,这将导致 要引发异常的枚举数。 确保螺纹在使用过程中的安全性 枚举时,可以锁定 在整个过程中收集 枚举或捕获异常 由其他公司所做的变更引起的 线程


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

这也是我的答案,尽管这仍然是一个灾难的配方:)@sridawg-这是一个灾难的配方,因为在下面的某个地方,您可以从多个线程访问该结构……在这种情况下,事情不再是线程安全的。我想,除非我有一个方法要求线程在访问之前指定其索引。@sridawg请查看我的答案,以获取在这种特殊情况下的线程安全分析。请注意,由于以下原因,这可能会非常低效。除非您非常确切地知道自己在做什么,否则让多个线程写入一个公共对象(并发集合除外)绝对不是一个好主意。你应该重组你的程序流程,这样就没有必要了。这些人是对的。这闻起来很难闻。记住,你应该像对待员工一样对待线程:它们很昂贵,所以除非你有很多工作要做,否则不要雇用它们。这些线程将花费大部分时间空闲,等待数据库。如果你希望收到12封信,你会雇12位秘书在邮箱旁等吗?不要制造线程,除非它们耗尽了你的处理器,也不要制造比你拥有的处理器更多的线程。哦,天哪,你不是刚刚指责@EricLippert在这方面没有任何经验吧?不,看起来像是你干的!你可能需要做一点关于他是谁的研究-真的,如果我是你的话,我真的会…@安德拉佐尔坦:不,不,客户总是他们自己系统的专家。我的建议是笼统的;在某些特定情况下,您可能希望烧掉12个线程所消耗的1200万字节,在某些特定情况下,您可能希望承担跨工作线程共享内存的痛苦。不过我尽量避免这样。我真的很抱歉,我的免费和善意的建议让你失望了。