我认为这是一个关于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;
}
答案 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没有共享状态。