8 —— future其它成员函数、shared_future

一 future其它成员函数

  • wait_for()
      卡住当前流程,等待std::async()的异步任务运行一段时间,然后返回其状态std::future_status。如果std::async()的参数是std::launch::deferred(延迟执行),则不会卡住主流程。
  • std::future_status
      枚举类型,表示异步任务的执行状态。
      std::future_status::ready :表示异步任务已经执行完成
      std::future_status::timeout :表示异步任务还没有执行完,超过了所等待的时间
      std::future_status::deferred :表示异步任务被推迟执行,wait_for()不用等待。
#include 
#include 
#include 

using namespace std;

int mythread()
{
	cout << "mythread start, thread id: " << std::this_thread::get_id() << endl;
	std::this_thread::sleep_for(5s); //	休眠五秒
	cout << "mythread end" << endl;
	return 5;
}


int main()
{
	cout << "main thread id: " << std::this_thread::get_id() << endl;
	std::future result = std::async(std::launch::deferred,mythread);
	cout << "continue ..." << endl;


	std::future_status status = result.wait_for(3s); //	等会mythread运行一段时间,流程卡在这里
	if (status == std::future_status::timeout)	//	超时,等待mythread运行3S后返回值,但是没有返回
	{
		// 表示线程还没有执行完
		cout << "time out" << endl; 
	}
	else if (status == std::future_status::ready)	//	执行完毕
	{
		// 表示成功返回
		cout << "mythread execute finished" << endl;
		cout << result.get() << endl;
	}
	else if (status == std::future_status::deferred)	//	延迟执行
	{
		//	如果async的第一个参数被设置为std::launch::deferred,则本条件成立
		//	根本没有创建子线程
		//	此时result.wait_for()不会卡住主流程,直接跳到这里。
		cout << "deferred " << endl;
		cout << result.get() << endl;
	}

	cout << "I Love China" << endl;

	getchar();
	return 0;	// 主线程返回之前,会等待mythread线程执行完毕才返回
}

二 shared_future

  std::future的成员函数get()只能调用一次,因为它使用的是移动语言。调用get()后,把原有对象的中的值移动到另一个对象中去。
  如果想将线程的返回值传递给多个其它的线程,则不能使用std::future,而要使用std::shared_future。它的get()函数不是移动语义,而是将结果值复制到另外的对象中去。

#include 
#include 
#include 

using namespace std;


int mythread(int para)
{
	cout << "my thread start, thread id is " << std::this_thread::get_id() << endl;
	cout << "parameter is " << para << endl;
	std::this_thread::sleep_for(5s);	//	线程休眠5秒
	cout << "my thread end, thread id is " << std::this_thread::get_id() << endl;

	return para;
}

void mythread2(std::shared_future &tmp_f)
{
	cout << "thread2 result is " << tmp_f.get() << endl;
}

int main()
{
	cout << "main thread id is " << std::this_thread::get_id() << endl;
	std::packaged_task mypt(mythread);																			
	std::thread t1(std::ref(mypt), 1);				
	t1.join();

	std::future result = mypt.get_future();
	std::shared_future result_s(std::move(result));
	//	另一种写法
	//std::shared_future result_s(result.share());	//	执行完毕后,result_s有值,result为空

	bool vaild = result_s.valid(); // 能够判断result_s中的是不是有效值
	cout << result_s.get() << endl;
	cout << result_s.get() << endl;	//	多次get,不会再产生问题

	std::thread	t2(mythread2, std::ref(result_s));
	t2.join();

	cout << "I Love China" << endl;


	getchar();
	return 0;
}

你可能感兴趣的:(C++并发)