在线程池中复用C#5.0的异步 - 线程安全吗?

ShZ*_*ShZ 11 c# thread-safety threadpool async-await

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

该方法:

使用SynchronizationContext调度到线程池的异步用户代码运行.用户代码看起来像:

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

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

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

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

Ste*_*ary 10

这可以在async/ awaitFAQ的评论部分回答:

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

因此,没有必要明确的障碍.