如何确保具有公共属性的两个元素永远不会在并行for循环(在C#中)中被多线程处理?
大家好,非常感谢你们在这方面帮助我:) 我想做的很简单。让我们举个例子如何确保具有公共属性的两个元素永远不会在并行for循环(在C#中)中被多线程处理?,c#,multithreading,parallel-processing,C#,Multithreading,Parallel Processing,大家好,非常感谢你们在这方面帮助我:) 我想做的很简单。让我们举个例子 class Human{ object someObject1; object someObject2; object someObject3; void modifyObject(){ //[...] do some stuff that may require time and can modify someObject1 2 and 3 } } class C
class Human{
object someObject1;
object someObject2;
object someObject3;
void modifyObject(){
//[...] do some stuff that may require time and can modify someObject1 2 and 3
}
}
class Children : Human{
Human Parent1;
Human Parent2;
}
我认为这是循环:
foreach( var e in listOHumans){
e.Parent1.modifyObject();
e.Parent2.modifyObject();
}
我想要的是将这个for循环并行化。
问题在于,一个线程t1
和另一个线程t2
,可以在同一父线程的两个不同子线程上执行此任务。如果t1
和t2
同时执行modifyObject
。我想这可能会搞乱一些物体12和3。(我想要的是确保具有公共父级的两个子级永远不会同时被多线程处理,以便在for循环中更正someObject1、2和3)
在C#中,最好的方法是什么
我考虑了1000万人的名单,只有5%个有共同的父母。这意味着并行化可能是有用的,但我绝对不希望两个不同的线程在同一个实例上同时调用
modifyObject()
。使用多线程操作时,必须在使用对象时锁定它,以避免计算错误
class Human{
object someObject1;
object someObject2;
object someObject3;
void modifyObject(){
lock (someObject1)
{
//some operation with someObject1
}
lock (someObject2)
lock (someObject3)
{
//some operation with someObject2 and someObject3
}
}
}
这将确保您永远不会同时从两个线程修改对象。这是家庭作业吗?至少可以说,这个问题和人为的示例令人困惑。首先,当PLINQ和Parallel.For/Foreach可用时,您不需要也不应该尝试使用原始线程。其次,如果并行修改数据,问题将变得更加困难。最后,向列表中添加项目不需要并行化。现在,如果您删除所有文本,只留下
,我想计算每个人有多少个孩子。
,或者将其改为如何聚合层次结构?
您可以开始寻找答案,假设有足够的数据来证明并行化。一种选择是将层次结构展平并简单地进行计数,例如使用迭代器方法和SelectMany@StudentInFinance然后提供一个有意义的例子。不要修改数据。您不需要修改数据进行计数、平均或计算statistics@StudentInFinance张贴实际问题,不要试图简化或解释它。你可能可以在谷歌上搜索算法的名称或描述,然后并行化,并给出答案或博客帖子来实现它。如果你所做的只是增加一个变量,你不需要锁定任何东西是的。variable++等于variable=variable+1,这不是一个原子操作。不,你没有。你用一个简单的方法<代码>长度。或者使用.Count()
。或者使用Interlocked.Increment
,尽管这太过分了。仅仅将状态修改为计数的想法是错误的。ParallelEnumerable
有自己的count()
、Sum、Aggregate等,就像Enumerable
does@PanagiotisKanavos您是对的,Count()会更好,但是如果您不想使用LINQ,并且要递增一个变量,那么您必须锁定它。