簡單地說,std::future 可以用來獲取非同步任務的結果,因此可以把它當成一種簡單的執行緒間同步的手段。std::future 通常由某個 provider 建立,你可以把 provider 想象成乙個非同步任務的提供者,provider 在某個執行緒中設定共享狀態的值,與該共享狀態相關聯的 std::future 物件呼叫 get(通常在另外乙個執行緒中) 獲取該值,如果共享狀態的標誌不為 ready,則呼叫 std::future::get 會阻塞當前的呼叫者,直到 provider 設定了共享狀態的值(此時共享狀態的標誌變為 ready),std::future::get 返回非同步任務的值或異常(如果發生了異常)。
乙個有效(valid)的 std::future 物件通常由以下三種 provider 建立,並和某個共享狀態相關聯。provider 可以是函式或者類,其實我們前面都已經提到了,他們分別是:
乙個 std::future 物件只有在有效(valid)的情況下才有用(useful),由 std::future 預設建構函式建立的 future 物件不是有效的(除非當前非有效的 future 物件被 move 賦值另乙個有效的 future 物件)。
在乙個有效的 future 物件上呼叫 get 會阻塞當前的呼叫者,直到 provider 設定了共享狀態的值或異常(此時共享狀態的標誌變為 ready),std::future::get 將返回非同步任務的值或異常(如果發生了異常)。
//future example
#include //
std::cout
#include //
std::async, std::future
#include //
std::chrono::milliseconds
//a non-optimized way of checking for prime numbers:
bool
is_prime(
intx)
int
main()
C 併發程式設計之thread
std thread 在 標頭檔案中宣告,因此使用 std thread 時需要包含 標頭檔案。std thread 構造 注意 可被 joinable 的 thread 物件必須在他們銷毀之前被主線程 join 或者將其設定為 detached.示例 include include include...
C 併發程式設計之atomic
原子型別物件的主要特點就是從不同執行緒訪問不會導致資料競爭 data race 因此從不同執行緒訪問某個原子物件是良性 well defined 行為,而通常對於非原子型別而言,併發訪問某個物件 如果不做任何同步操作 會導致未定義 undifined 行為發生。std atomic flag是乙個b...
併發程式設計之併發佇列
jdk 中提供了一系列場景的併發安全佇列。總的來說,按照實現方式的不同可分為阻塞佇列和非阻塞佇列,前者使用鎖實現,而後者則使用cas 非阻塞演算法實現。1 非阻塞佇列 concurrentlinkedqueue concurrentlinkedqueue是無界非阻塞佇列,內部使用單項鍊表實現 其中有...