簡體   English   中英

在線程池中復用C#5.0的異步 - 線程安全嗎?

[英]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內存模型下保證線程安全。

我很確定在執行排隊的工作之前我需要插入一個內存屏障,但我對這里的推理並不完全有信心(或者這種方法可能由於完全不同的原因而不可行)。

這在async / await FAQ的評論部分中得到了解答

當任務排隊時以及任務執行的開始/結束時,TPL包括適當的障礙,以便適當地使值可見。

因此,沒有必要明確的障礙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM