如何将std :: promise传递给线程?通过std :: move或std :: shared_ptr?

xml*_*lmx 2 c++ multithreading future promise c++11

#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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

如何通过或通过std::promise对象传递给线程std::movestd::shared_ptr

哪个更好?

Yak*_*ont 7

首先得到未来,然后将承诺转移到线程中.

std::future<int> f() {
  std::promise<int> p;
  auto r=p.get_future();
  std::async(t1, move(p));
  return r;
}
Run Code Online (Sandbox Code Playgroud)

当然这是愚蠢的,因为你使用async块直到任务完成.但它是正确使用的promise.

分享承诺是不好的,它应该具有唯一的所有权,因为只有一个应该设置它的价值.而那些人应该拥有它的一生.

离开之后,你再也无法从中获得未来.

  • 源承诺移走后,您从承诺中获得的未来是否仍然有效? (2认同)
  • @eric是的。 (2认同)