std::future, std::async, std::promise
Posted chinabinlang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std::future, std::async, std::promise相关的知识,希望对你有一定的参考价值。
这是 C++ 的新特性;
直接示例说明;
#include <iostream>
#include <future>
#include <thread>
int testThread_2()
std::cout <<"start start start start start start start start start start start start " << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::cout << "stop stop stop stop stop stop stop stop stop stop stop stop " << std::endl;
return 12345;
int main()
std::future<int> ret = std::async(testThread_2);
std::cout << ret.get() << std::endl;
1:
std::async:启动一个线程,不可以用 for 循环启动多个线程,这样会一个线程执行完成,在执行下一个线程;
单挑语句执行,多线程效果;
std::future:获取线程返回结果;
ret.get() :这个函数会阻塞当前线程,直到 ret 有值;
ret 的值,get()一次后,无效了;
2:
ret.wait_for(std::chrono::milliseconds(500));
启动线程后,执行这条语句,会让线程先执行 500 毫秒后,在向后执行;
3:
如果觉得 get()函数可能会长期阻塞函数,可以添加等待超时,非常好用;
std::future<int> ret = std::async(testThread_2); //启动线程;
std::chrono::system_clock::time_point two_seconds_passed = std::chrono::system_clock::now() + std::chrono::seconds(10);
std::future_status ret_fstatus = ret.wait_until(two_seconds_passed); //超时等待;
if (ret_fstatus == std::future_status::ready) //判断超时原因;
std::cout << ret.get() << std::endl;
else
std::cout << "time out,还没有获取结果;" << std::endl;
std::cout << "===================================================" << std::endl;
4:
std::promise
这个可以在获取到 数值 前,阻塞当前线程,直到有值;
std::promise 的价值非常好,以前的 C++ 获取网络消息,需要异步线程获取,然后再通知处理;
现在就可以最简洁高效的写代码;
std::promise<int> g_ret;
void testThread_3()
std::cout << "testThread_3 in" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 5));
g_ret.set_value(12321);
std::cout << "testThread_3 out" << std::endl;
int main()
std::future<void> ret = std::async(testThread_3); //启动线程,赋值 g_ret;
std::cout << "g_ret.get_future().get();" << std::endl; //这句会被执行,因为上面只是启动线程;
int n = g_ret.get_future().get(); //这里会阻塞当前线程,直到 g_ret 有值;
可以看出,std::promise 获取 std::future
std::cout << n << std::endl;
return 0;
以上是关于std::future, std::async, std::promise的主要内容,如果未能解决你的问题,请参考以下文章
使用 std::future 和 std::async 的依赖求解器
std::future, std::async, std::promise
std::future, std::async, std::promise
std::future, std::async, std::promise
记录一个std::future和std::async的demo
使用 shared_from_this 参数等待 std::future 获取 std::async 会阻止对 this 的破坏