1. 程式人生 > >c++中的async

c++中的async

 在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;
}