C11 future

std::promise

promise 是一个类模板,模板参数便是产出值的类型。同样的,future 也是一个类模板,模板参数是获取的值的类型。

std::promise<_data> data_promise; //创建一个承诺
std::future<_data> data_future = data_promise.get_future(); //得到这个承诺封装好的期望

future 的 get() 方法是阻塞的,直到其他任何人调用了 set_value() 方法,相当于封装了mutex与condition。

std::packaged_task

packaged_task 也是一个类模板。get_future()获取线程返回值。

	std::packaged_task<_data()> prepare_data_task([]()->_data{
		std::this_thread::sleep_for(std::chrono::seconds(2));    //模拟数据生产过程
 
		return{ 1 };
	});
	auto data_future = prepare_data_task.get_future();          //获取future

future 的 get() 方法是阻塞的,相当于封装了join。

注意future.get()只能被调用一次,多次调用会触发异常, 如果想要在多个线程中多次获取产出值请查阅 shared_future。
感觉future是用来处理一个生产者与一个消费者的异步操作,不适合多个消费者线程的场景。

std::async

封装一个异步操作,省却了起线程、互斥锁、条件。

	std::future<_data> data_future = std::async(std::launch::async, []()->_data{
		std::this_thread::sleep_for(std::chrono::seconds(1));           //模拟生产过程
		return { 1 };
	});

猜你喜欢

转载自blog.csdn.net/zorro_zhb/article/details/85165135
C11