11

这可能看起来有点疯狂,但这是我正在考虑作为更大库的一部分的一种方法,如果我可以合理地确定它不会导致奇怪的行为。

该方法:

SynchronizationContext使用调度到线程池的 async 用户代码运行。用户代码如下所示:

async void DoSomething()
{
    int someState = 2;
    await DoSomethingAsync();
    someState = 4;
    await DoSomethingElseAsync();
    // someState guaranteed to be 4?
}

我不确定访问someState是否是线程安全的。虽然代码将在一个“线程”中运行,这样操作实际上是完全有序的,但它仍然可以在引擎盖下的多个线程中拆分。如果我的理解是正确的,那么在 x86 上排序应该是安全的,并且由于变量不是共享的,我不需要担心编译器优化等等。

更重要的是,我担心这是否会在 ECMA 或 CLR 内存模型下保证线程安全。

我相当确定在执行排队的工作之前我需要插入一个内存屏障,但我对我的推理并不完全有信心(或者这种方法可能由于完全不同的原因而行不通)。

4

1 回答 1

10

async这在/ awaitFAQ的评论部分得到了回答:

TPL 在任务排队时和任务执行的开始/结束时包括适当的障碍,以便适当地使值可见。

因此,不需要明确的障碍。

于 2012-11-13T13:14:01.443 回答