如何将类的状态立即传播到子线程

本文关键字:传播 线程 状态 | 更新日期: 2023-09-27 18:24:37

我有一个类,在其中我生成了几个线程来做一些工作。现在我想要在发生事件时停止工作的能力。事件处理程序在派生类中设置一个字段,例如(Interrupted)。在我的For Each委托中,在继续下一次迭代之前,我会检查这个标志。

public bool Interrupted { get; set; }
Parallel.ForEach(some collection){
if (Interrupted)
                        {
                            parallelLoopState.Break();
                            return;
                        }
    else 
    DoSomething();
}

现在,一旦Interrupted在父线程上设置为true。它对Parallel.Foreach派生的线程可见吗?还是需要一段时间才能看到?

我的测试间歇性地失败,这表明即使在父线程设置了标志之后,子线程也会执行几次?我是不是错过了一些基本的东西?

这是Volatile的一个用例场景吗?

如何将类的状态立即传播到子线程

您可以对传递给parallel.ForEach方法的代码块进行并行执行。因此,当主线程将if(Interrupted)测试设置为true时,一些线程将刚好通过该测试。只有foreach循环的后续执行才会捕获它。

我不会对Interrupted在其他线程中的更改可见性做出任何假设。你只需要做最坏的打算。您必须添加显式同步,以确保对属性的更改对Parallel循环构造立即可见。

话虽如此,我怀疑"执行了几次的子线程"是设置Interrupted和读取它之间竞争的结果。记住,Parallel.ForEach可能会有很多线程执行这项工作,所以所有在更改之前通过读取的线程仍将继续执行DoSomething