std::promise作用:
当我们需要获取一个线程运行中的某个值且不想等待这个线程全部运行结束,因为可能接下来的代码与我想要获取的结果无关,且非常耗时,比如一些资源的清理,或者仅仅是想获取某个结果,但是我们并不感兴趣这个线程什么时候结束的时候都可以用std::promise
promise的源码实在是看不懂,索性就直接上例子了:
void testPromise(std::promise<std::string> value) {
std::cout << "in function" << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
std::cout << "get vlaue" << std::endl;
value.set_value("Get Value");
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
std::cout << "out function" << std::endl;
}
int main() {
std::promise<std::string> value;
std::future<std::string> future = value.get_future();
std::thread th(testPromise, std::move(value));
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
std::cout << "the future = " << future.get() << std::endl;
th.join();
}
promise支持模板,这个模板类型指的是我们需要获得值的类型,这个很好理解;
然后我们用一个相同模板类型的future类与promise绑定起来,这个是通过get_future函数做到的,这个时候future与promise实例进行了绑定;
最后,thread函数我们是用std::move函数将promise实例将其移动到testPromise函数中,因为promise是不可拷贝的类型,这个我们可以发现promise的拷贝构造函数是被delete了的,只能由移动构造函数进行传递,可能是因为future与promise有一个一对一的绑定关系,且是方案一对多或者多对多的;