2013-06-02 39 views
19

對C++ 14的建議之一是Resumable Functions,它給C++提供了今天C#中可用的異步/等待機制。基本思想是在等待異步操作完成時,可以暫停功能 。異步操作完成後,可以在暫停該功能的地方繼續執行該功能。這是以非阻塞的方式完成的,以便從中調用可恢復功能的線程不會被阻塞。在什麼情況下可恢復函數在C++ 14中執行?

我不明白在哪個上下文(線程)函數將被恢復。它會被暫停函數的線程恢復(這是它在C#中的完成方式,因爲我理解它),還是使用另一個線程?

如果它被暫停的線程恢復,那麼該線程是否必須處於某種特定的狀態,或者調度程序是否會處理它?

+1

我不知道你問了什麼,但是如果resume函數是非阻塞的,那麼它可能會返回某種'std :: optional',接收方必須檢查結果是否可用或者不。聽起來你已經可以用'std :: future'的當前機制編寫代碼了......? –

+0

我不認爲該提案獲得通過。 – chris

+0

@Karrek SB:如果您想了解該提案,則提案已關聯。你說得對,可以用期貨來實現同樣的事情(通常也用未來的提議)。該提案詳細說明了它與直接使用期貨的不同之處,以及爲什麼這是一個好主意。 –

回答

4

從N3564報價:

暫停後,可恢復函數可以通過運行時的調度邏輯予以恢復,並最終將完成它的邏輯,此時它執行return語句(顯式或隱式)並在佔位符中設置函數的結果值。

因此應該注意,函數從外部(調用者)和內部觀察到的行爲之間存在不對稱:外部視角是該函數在第一個懸掛點返回未來類型的值,而內部透視是函數通過返回語句返回類型T的值,返回future/shared_future的函數仍然有所不同。

可恢復功能可能會在其執行暫停後繼續在另一個線程上繼續執行。

這基本上意味着

  • 當第一次調用,可恢復功能在它的調用者的線程上下文來執行。
  • 在每個暫停點之後,實現可以自由選擇在哪個線程繼續執行可恢復功能
  • 從調用代碼的角度來看,可恢復函數的工作方式類似於異步函數,其中一部分(可觀察)行爲在函數調用返回時可靠執行,但最終結果可能尚未完成(返回的future<T>不必處於就緒狀態)。作爲一名程序員,您不必爲了恢復而恢復可恢復的功能。
+0

請參閱這裏的一些實際操作:http://blogs.msdn.com/b/vcblog/archive/2013/12 /20/asynchronous-programming-in-c-using-resumable-functions-and-await.aspx –

+0

以及更多http://blogs.msdn.com/b/vcblog/archive/2014/11/12/resumable-功能合c.aspx –

相關問題