如何将 std::promise 传递到线程中?通过 std::move 或 std::shared_ptr?
How to pass std::promise into a thread? by std::move or by std::shared_ptr?
#include <future>
using namespace std;
void t1(promise<int> p)
{
this_thread::sleep_for(chrono::seconds(5));
p.set_value(0);
}
void t2(shared_ptr<promise<int>> p)
{
this_thread::sleep_for(chrono::seconds(5));
p->set_value(0);
}
future<int> f1()
{
promise<int> p;
async(t1, move(p));
return p.get_future();
}
future<int> f2()
{
auto p = make_shared<promise<int>>();
async(t2, p);
return p->get_future();
}
int main()
{
f1().get();
f2().get();
return 0;
}
我的问题是:
如何将 std::promise
对象传递到线程中,std::move
或 std::shared_ptr
?
哪个更好?
先获取 future,再将 promise 移入线程。
std::future<int> f() {
std::promise<int> p;
auto r=p.get_future();
std::async(t1, move(p));
return r;
}
当然这是愚蠢的,因为您使用 async
会阻塞直到任务完成。但正确的用法是promise
.
共享一个承诺是不好的,它应该有唯一的所有权,因为只有一个人应该设置它的值。不管是谁,都应该拥有自己的一生。
离开它之后,你就不能再从它那里得到未来。
#include <future>
using namespace std;
void t1(promise<int> p)
{
this_thread::sleep_for(chrono::seconds(5));
p.set_value(0);
}
void t2(shared_ptr<promise<int>> p)
{
this_thread::sleep_for(chrono::seconds(5));
p->set_value(0);
}
future<int> f1()
{
promise<int> p;
async(t1, move(p));
return p.get_future();
}
future<int> f2()
{
auto p = make_shared<promise<int>>();
async(t2, p);
return p->get_future();
}
int main()
{
f1().get();
f2().get();
return 0;
}
我的问题是:
如何将 std::promise
对象传递到线程中,std::move
或 std::shared_ptr
?
哪个更好?
先获取 future,再将 promise 移入线程。
std::future<int> f() {
std::promise<int> p;
auto r=p.get_future();
std::async(t1, move(p));
return r;
}
当然这是愚蠢的,因为您使用 async
会阻塞直到任务完成。但正确的用法是promise
.
共享一个承诺是不好的,它应该有唯一的所有权,因为只有一个人应该设置它的值。不管是谁,都应该拥有自己的一生。
离开它之后,你就不能再从它那里得到未来。