根據最新的C++ TS:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4628.pdf,基於對C#異步/等待語言支持的理解,我想知道什麼是「執行上下文」(從C# )的C++協程?C++ 1z協同線程上下文和協程調度
我在Visual C++ 2017 RC中的簡單測試代碼揭示了協程似乎總是在一個線程池線程上執行,並且很少控制應用程序開發者在其上可以執行協程的線程上下文。應用程序是否可以強制所有的協同程序(使用編譯器生成的狀態機代碼)僅在主線程上執行,沒有涉及任何線程池線程?
在C#中,SynchronizationContext是指定所有協程「半部」(編譯器生成的狀態機代碼)將被髮布和執行的「上下文」的一種方式,如本文所示:https://blogs.msdn.microsoft.com/pfxteam/2012/01/20/await-synchronizationcontext-and-console-apps/,而當前協程實現在Visual C++ 2017 RC中似乎總是依賴於併發運行時,它默認在線程池線程上執行生成的狀態機代碼。是否有類似的同步上下文概念,用戶應用程序可以使用它來將協程執行綁定到特定的線程?
此外,在Visual C++ 2017 RC中實現的協程的當前默認「調度程序」行爲是什麼?即1)如何準確指定等待條件? 2)當等待條件滿足時,誰調用暫停協程的「下半部分」?我對C#中的任務調度的(幼稚)推測是,C#「純粹通過任務延續」實現「等待條件 - 等待條件由TaskCompletionSource擁有的任務合成,並且需要等待的任何代碼邏輯將被鏈接作爲它的延續,所以如果等待條件得到滿足,例如如果從低級網絡處理程序收到完整的消息,它會執行TaskCompletionSource.SetValue,它將底層任務轉換爲完成狀態,從而有效地允許鏈式繼續邏輯開始執行(將任務從先前創建的狀態) - 在C++協同程序中,我推測std :: future和std :: promise將用作類似的機制(std :: future是任務,而std :: promise是TaskCompletionSource,而用法也是令人驚訝的相似!) - C++協程調度程序(如果有的話)也依賴於某種類似的機制來執行該行爲?我編寫了一個非常簡單但非常強大的awaitable抽象,它支持單線程和協作式多任務處理,並且具有一個簡單的基於thread_local的調度器,它可以在線程根協程啓動。該代碼可以從這個GitHub庫中找到:https://github.com/llint/Awaitable
Awaitable是它保持正確調用的嵌套級別排序的方式組合的,並且它的功能基本收益,定時等待,並設定從別的地方準備好,也很複雜(如無限循環協程,只有在某些事件發生時纔會喚醒),編程模型緊隨基於C#Task的異步/等待模式。請隨時提供您的反饋。
偉大的問題!至於C#中的任務調度,其全部在[github](https://github.com/dotnet/coreclr/tree/master/src/mscorlib/src/System/Threading/Tasks)處打開,提供了一些很好的見解。至於C++,其中一個提案[n4286](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4286.pdf)(在提交到草案之前)涵蓋了演示實現過度提振的未來,但它似乎'誰'調用延續真的會依賴於impl –
我認爲你的問題同樣適用於線程/上下文[future :: then](http://en.cppreference.com/w/) cpp/experimental/future/then)會被調用,即undefined¯\ _(ツ)_ /¯ –
感謝您的評論。然而,對於「誰」調用繼續,我會推測應該有一些建議的標準措辭或設施來支持實現定製的單線程協程調度程序 - 例如,如果一切都將在主線程上執行,則應在主線程上調用主調度器循環(或滴答),以便在所有計劃的「任務一半」上執行 - 或「主」線程可以是我選擇的更多不可控的線程池線程的任何線程。 – Dejavu