保护对packaged_task的访问

时间:2014-07-03 07:09:05

标签: c++11 concurrency

我认为这是一个关于std :: packaged_task的共享访问的简单问题。

在下面的代码中,我不确定是否需要互斥锁来保护对象'p'的访问。

似乎我应该,因为p.operator()可以在后台线程中与主线程中的p.get_future()同时调用。或者这种对packaged_task对象的访问是否已经以某种方式受到保护?

static double f(int a, int b) { return a * b; }

int main()
{
    // Execute f() "immediately" in another thread
    //std::future<double> result = std::async(f, 2, 3);
    //std::cout << result.get() << std::endl;

    // Deferred execution of f()
    std::packaged_task<double(int, int)> p(f);
    std::thread tt([&p]{ /* processing ... */; p(2, 3); });
    std::cout << p.get_future().get() << std::endl;
    tt.join();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

据我所知(标准的N3337草案),只要创建共享状态并且尚未获取未来,一切都应该很好。

packed_task ctoring和将来的提取在您的代码中是连续的;因此我明白你提到的可能的碰撞应该没有坏处;至少在下面的第14项中没有提到这样的问题。

N3337§30.6.9.1[futures.task.members]

具有

  

1 [...]

  template <class F> packaged_task(F&& f);

     

[...]
  3效果:构造一个具有共享状态的新的packaged_task对象[...]   [...]

     

11 [...]

  future<R> get_future();

  [...]

  13抛出:发生错误时的future_error对象   14错误情况:
   - future_already_retrieved如果已在具有与此相同的共享状态的packaged_task对象上调用get_future。
   - no_state if * this没有共享状态。