1

我有一堂课,我正在产生几个线程来做一些工作。现在我希望能够在发生事件时停止工作。事件处理程序在生成的类say(Interrupted) 中设置一个字段。在我的 For-Each 代表中,我在继续下一次迭代之前检查了这个标志。

public bool Interrupted { get; set; }

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

}

现在一旦在父线程上将 Interrupted 设置为 true。Parallel.Foreach 生成的线程会立即看到它吗?还是需要一些时间才能看到?

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

这是 Volatile 的用例场景吗?

4

2 回答 2

1

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

于 2013-07-23T17:34:23.363 回答
0

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

话虽如此,我怀疑“子线程执行了几次”的观察结果是设置Interrupted和读取之间竞争的结果。请记住,Parallel.ForEach可能会有许多线程执行工作,因此在更改之前完成读取的所有线程仍将继续执行DoSomething

于 2013-08-01T04:29:36.650 回答