C11執行緒管理 非同步操作

2022-05-07 00:48:11 字數 2797 閱讀 3180

c++11提供了非同步操作相關的類,std::future、std::promise和std::package_task。std::future作為非同步結果的傳輸通道,方便的獲取執行緒函式的返回值;std::promise用來包裝乙個值,將資料和future繫結起來,方便執行緒賦值;std::pack_age用來包裝乙個可呼叫物件,將函式和future繫結起來,以便非同步呼叫。

所以,thread庫提供了future來訪問非同步操作的結果,因為是等待執行緒執行完,在未來獲取,所以被成為future,future提供了獲取非同步操作結果的通道,可以通過同步等待來獲取操作結果,並可以查詢future的狀態來獲取非同步操作的結果。

future的狀態:

deferred,非同步操作還未開始;

ready,非同步操作已經完成;

timeout,非同步操作超時。

//

查詢狀態

std::future_status status; do

else

if(status ==std::future_status::ready)

else

}while(status != std::future_status::ready)

獲取future有三種方式:get,wait,wait_for,其中get等待非同步操作結束並返回結果,wait只是等待非同步操作完成,沒有返回值;wait_for是超時等待返回結果。

std::promisepr;

std::thread t((std::promise

& p), std::ref

(pr));

std::future

f =pr.get_future();

int i = f.get

();

//執行後 i = 9

std::package_task包裝乙個可呼叫物件的包裝類(如function,lambda expression,bind expression,和其它的函式物件),將函式和future繫結起來,以便非同步呼叫,它和promise的區別是,promise繫結的是乙個變數,而package_task則是繫結的乙個函式。

std::packaged_task task(());

std::thread t1(std::

ref(task));

std::future

f1 =task.get_future();

int i = f1.get

();

//執行後 i = 5

future提供乙個訪問執行緒非同步操作結果的機制,它和執行緒是乙個級別的,屬於最底層。package_task和promise則是內部都有future,promise是包裝乙個值,而package_task是包裝乙個操作物件,具體使用哪個要根據實際情況來做區分。

需要注意的是,future是不可拷貝的,只能移動,shared_future可以拷貝,如果需要放到容器或者其他地方,則需要用到shared_future。

std::async比std::promise、std::package_task和std::thread更上層,它可以用來直接建立非同步的task,非同步任務返回的結果儲存在future中,當需要獲取執行緒執行的結果,可以通過future.get()來獲取,如果不關注非同步任務的結果,只是簡單的等待任務執行完成,則呼叫future.wait()即可。

std::async是更高層次的非同步操作,使我們不關心執行緒建立的內部細節,就能方便的獲取執行緒非同步執行的結果,還可以指定執行緒建立策略,更多的時候應該使用 std::async來建立執行緒,成為非同步操作的首選。

std::async原型為std::async(std::launch::async | std::launch::deferred,f,args...),第乙個引數為執行緒的建立策略,第二個為執行緒函式,其他的為執行緒函式的引數。

關於建立策略有兩種:

std::launch::async:在呼叫async就開始建立執行緒;

std::launch::deferred:延遲載入的方式建立執行緒,呼叫async的時候不建立執行緒,直到呼叫了future的get或者wait方法來建立執行緒。

#include #include 

#include

#include

intmain()

); std::cout

<< f1.get() << std::endl; //

output 8

std::future

f2 = std::async(std::launch::async, ());

f2.wait();

//output 8

std::future

f3 =std::async(std::launch::async, ()

);std::cout

<< "

wating...

"

do

else

if (status ==std::future_status::timeout)

else

} while (status !=std::future_status::ready);

std::cout

<< "

result:

"<< f3.get()

}//執行結果:88

wating...

timeout.

timeout.

ready.

result:

8

C 11 非同步操作

主要有std future std promise和std package task。std future作為非同步結果的傳輸通道,可以很方便的獲取執行緒函式的返回值。std promise用來包裝乙個值,將資料和future繫結起來,方便執行緒賦值。std package task用來包裝乙個可呼...

C 11 多執行緒 執行緒管理基礎

c 11 所有的執行緒都封裝在標頭檔案中,使用命名空間std說明。最簡單的例子 include include void hello intmain 每個執行緒都必須有乙個初始函式,新執行緒在函式中執行。join 的作用是等待執行緒執行完畢,然後向下執行。該例子中,如果沒有join,那麼可能出現主線...

C11執行緒管理 條件變數

c11提供另外一種用於等待的同步機制,它可以阻塞乙個或者多個執行緒,直到收到另外乙個執行緒發出的通知或者超時,才會喚醒當前阻塞的執行緒。條件變數要和互斥量配合起來使用。condition variable,配合std unique lock進行wait操作。condition variable an...