C++的并发世界(十)——线程异步和通信

1.promise

promise用于异步传输变量

std::promise提供存储异步通信的值,再通过其对象创建的std::future异步获得结构。
std::promise只能使用一次。
void set_value(_Ty &&Val)设置传递值,只能用掉一次

2.future

get()阻塞等待promise的set_value的值

3.示例代码

#include <thread>
#include <iostream>
#include <future>
#include <string>

void TestFuture(std::promise<std::string> p)
{
	std::cout << "begin TestFuture" << std::endl;
	std::this_thread::sleep_for(std::chrono::seconds(1));
	std::cout << "begin set value" << std::endl;
	p.set_value("TestFuture value");
	std::this_thread::sleep_for(std::chrono::seconds(1));
	std::cout << "end TestFuture" << std::endl;
}

int main()
{
	std::promise<std::string> p;
	auto future = p.get_future();
	auto th = std::thread(TestFuture,std::move(p));
	std::cout << "begin future.get()" << std::endl;
	std::cout << "future get() = " << future.get() <<std::endl;
	std::cout << "begin future.get()" << std::endl;
	th.join();
	getchar();
	return 0;
}

4.packaged_task异步调用函数打包

packaged_task包装函数为一个对象,用于异步调用,其返回值能通过std::future对象访问;
与bind不同,其可异步调用,函数访问和获取返回值分开调用

#include <thread>
#include <iostream>
#include <future>
#include <string>

std::string TestPack(int index)
{
	std::cout << "begin Test Pack" << std::endl;
	std::this_thread::sleep_for(std::chrono::seconds(2));
	return "Test Pack return"
}

int main()
{
	std::packaged_task<std::string(int)> task(TestPack);
	auto result = task.get_future();
	std::thread th(std::move(task),101);
	std::cout << "begin result get " << std::endl;
	std::cout << "return get " << std::endl;
	th.join();
	return 0;
}

5.async创建异步线程替代thread

C++11异步运行一个函数,并返回保有其结果的std::future

launch::deferred延迟执行,再调用wait和get时,调用函数代码;
launch::async创建线程
返回的线程函数的返回值类型的std::future(std::future<线程函数的返回值类型>)
get获取结果,会阻塞等待

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值