如何确保具有公共属性的两个元素永远不会在并行for循环中进行多线程(在C#中)?

时间:2017-12-15 10:29:50

标签: c# multithreading parallel-processing

大家好,非常感谢帮助我:)

我想做的很简单。我们来举个例子。

foreach( var e in listOHumans){
     e.Parent1.modifyObject();
     e.Parent2.modifyObject();
}

我认为这是循环:

t1

我想要的是并行化这个for循环。 问题是线程t2和另一个t1可以在同一父节点的两个不同子节点上完成工作。如果t2modifyObject同时执行modifyObject()。我认为可能会混淆someObject1 2和3. (我想要的是确保两个孩子有一个共同的父永远不会在奥德的同时多线程进行纠正some循环中的someObject1 2和3)。

在C#中最好的方法是什么?

我考虑一份1000万人的名单,只有5%有普通父母。这意味着并行化可能很有用,但我绝对不希望{{ app.user.username }} 在同一个实例上同时被两个不同的线程调用。

1 个答案:

答案 0 :(得分:-2)

当您使用多线程操作时,在使用对象时必须lock,以避免计算错误。

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
        }
    }
}

这将确保您不会同时从两个线程修改对象。