C++11多线程:std::shared_future:也是个类模板,get()函数复制数据

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、std::shared_future
  • 二、使用步骤
    • 1.代码案例
  • 总结


前言

std::shared_future:也是个类模板,get()函数复制数据


一、std::shared_future

std::shared_future:也是个类模板,get()函数复制数据

二、使用步骤

1.代码案例

代码如下(示例):

int mythread1(int mypar)
{
	cout << "mythrea() start" << " threadid = " << std::this_thread::get_id() << endl;	//新线程id
	std::chrono::milliseconds dura(5000);	//订一个5秒的时间
	std::this_thread::sleep_for(dura);	//休息了一定时长
	cout << "mythread() end" << " threadid = " << std::this_thread::get_id() << endl;
	return 5;
}

//void mythread2(std::future &tmpf)  //注意参数
void mythread2(std::shared_future<int> &tmpf)
{
	cout << "mythread2() start" << " threadid = " << std::this_thread::get_id() << endl;
	auto result = tmpf.get();
	//获取值,只能get一次否则会报异常
	//result = tmpf.get();
	//为什么第二次get这个future我们会得到一个异常;主要是因为get函数的设计,是一个移动语义
	cout << "mythread2 result" << result << endl;
	return;
}

int main()
{
	//二:std::shared_future:也是个类模板,get()函数复制数据

	cout << "main" << " threadid = " << std::this_thread::get_id() << endl;
	std::packaged_task<int(int)> mypt(mythread1);
	//我们把函数mythread通过packaged_task包装起来;
	std::thread t1(std::ref(mypt), 1);
	//线程直接开始执行,第二个参数 作为线程入口函数的参数;
	t1.join();
	//我们可以调用这个等待线程执行完毕,不调用这个不太行,会崩溃

	std::future<int> result = mypt.get_future();
	//std::future大家不陌生了,这个对象里含有线程入口函数
	std::shared_future<int> result_s(std::move(result));
	bool ifcanget = result.valid();
	//std::shared_future result_s(result.share());
	//执行完毕后result_s里有值,而result里空了
	ifcanget = result.valid();

	//std::shared_future result_s(mypt.get_future()); //通过get_future返回值直接构造了一个share_future对象。
	auto mythreadresult = result_s.get();
	mythreadresult = result_s.get();

	//std::thread t2(mythread2, std::ref(result));
	std::thread t2(mythread2, std::ref(result_s));
	t2.join();
	//等线程执行完毕

	cout << "I Love China!" << endl;
	return 0;
}

运行截图:
C++11多线程:std::shared_future:也是个类模板,get()函数复制数据_第1张图片


总结

了解std::shared_future的用法。
持续更新中…

你可能感兴趣的:(c++,开发语言)