c++中的async
阿新 • • 發佈:2018-12-31
在c++11中為我們提供了一種十分簡易又遍歷的非同步執行緒的方法,這種就是async。以下是async的一些使用方法。分為以下幾步:如何啟動非同步執行緒,如何知道非同步執行緒的狀態,怎麼得到非同步執行緒的結果。
#include "future" #include "thread" #include "iostream" #include "windows.h" using namespace std; class A { public: A() {} void print(int a) { cout << a << endl; } }; int main() { A a; //std::future 的三種啟動策略 //1.std::launch::deferred 當其他執行緒呼叫get來獲取狀態時,將呼叫非非同步行為 //2.std::launch::async 保持非同步行為,即傳入的執行緒函式將在另一個執行緒中非同步執行 //3.std::launch::deferred | std::launch::async,預設啟動策略,他可以非同步或著同步執行,取決與系統,不能自己控制 //推薦每次使用async時,都使用std::launch::async //程式碼一 //std::future<int> result = async(std::launch::async, [&a](int i) {Sleep(10000); cout << i << endl; return i + 1; }, 5); //std::future<int> result = async(std::launch::async, [&a](int i) {Sleep(10000); a.print(i); return i + 1; }, 5); //cout << "hello" << endl; //Sleep(10000); //cout << "result" << result.get() << endl; //std::future 獲取狀態的三種方式 //1.get 等待非同步操作結束並返回結果,get只能呼叫一次,因為會使future失效,會啟動沒啟動的執行緒 //2.wait 只是等待非同步操作完成,沒有返回值,會啟動沒啟動的執行緒 //3.wait_for 超時等待返回結果。,不會啟動沒啟動的執行緒 //所以需要得到返回結果的時候,只能使用get //std::future 的三種狀態 //1.std::future_status::deferred 非同步操作還沒開始 //2.std::future_status::ready 非同步操作已經完成 //3.std::future_status::timeout 非同步操作超時 //std::future<int> result = async(std::launch::async, [&a](int i) {Sleep(10000); a.print(i); return i + 1; }, 5); //cout << "hello" << endl; //std::future_status status; //do //{ // status = result.wait_for(std::chrono::seconds(1)); // if (std::future_status::deferred == status) // { // cout << "執行緒還未啟動" << endl; // } // else if (std::future_status::ready == status) // { // cout << "執行緒已啟動" << endl; // } // else // { // cout << "執行緒超時" << endl; // } //} while (std::future_status::ready != status); //async獲取執行緒結果的三種途徑 //1.使用std::future ,通過get獲取到返回的結果 //2.std::promise std::promise為獲取執行緒函式中的某個值提供便利, //線上程函式中給外面傳進來的promise賦值,通過get_future獲取的結果 //注意的是取值是間接的通過promise內部提供的future來獲取的 //3.std::packaged_taskstd::packaged_task它包裝了一個可呼叫的目標 //(如function, lambda expression, bind expression, or another function object) //,以便非同步呼叫,它和promise在某種程度上有點像,promise儲存了一個共享狀態的值, //而packaged_task儲存的是一個函式 //程式碼三 std::promise<int> pr; async(std::launch::async, [](std::promise<int>& p) {p.set_value(10);}, std::ref(pr)); std::future<int> param = pr.get_future(); cout << "value is " << param.get() << endl; std::packaged_task<int()> task([]() {return 8; }); async(std::launch::async, std::ref(task)); std::future<int> param2 = task.get_future(); cout << "task value is " << param2.get() << endl; return 0; }