[英]Multiplexing C# 5.0's async over a thread pool — thread safe?
這可能看起來有點瘋狂,但這是我正在考慮作為更大的庫的一部分的方法,如果我可以合理地確定它不會導致奇怪的行為。
該方法:
使用分派給線程池的SynchronizationContext
運行異步用戶代碼。 用戶代碼看起來像:
async void DoSomething()
{
int someState = 2;
await DoSomethingAsync();
someState = 4;
await DoSomethingElseAsync();
// someState guaranteed to be 4?
}
我不確定訪問someState
是否是線程安全的。 雖然代碼將在一個“線程”中運行,使得操作實際上是完全有序的,但它仍然可以分布在引擎蓋下的多個線程中。 如果我的理解是正確的,那么在x86上排序應該是安全的,並且因為變量不是共享的,所以我不需要擔心編譯器優化等等。
更重要的是,我擔心這是否會在ECMA或CLR內存模型下保證線程安全。
我很確定在執行排隊的工作之前我需要插入一個內存屏障,但我對這里的推理並不完全有信心(或者這種方法可能由於完全不同的原因而不可行)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.