一般问题: 是std :: shared_future :: operator = atomic?
例如
struct object {
object() {
sf = std::async(std::launch::async, &async_func).share();
}
void change(){
sf = std::async(std::launch::async, &other_async_func).share();
}
void read(){
while (true){ sf.get(); }
}
std::shared_future<int> sf;
};
问题第1部分在左侧调用std::shared_future::operator=
是否可以,例如旧的shared_future
,还没有等待/ 异步提供程序仍在运行?就像在object::change()
中一样。
问题第2部分在其他异步返回对象 /并发调用std::shared_future::operator=
的线程时调用std::shared_future.get()
是否可以?就像object::read()
一样?
修改:忘记object::read()
,我当然是指他们自己的std::shared_future
,但是相同的共享状态。
阅读C ++ 11草案N3485§30.6.7:12
shared_future&安培; operator =(shared_future&amp;&amp; rhs)noexcept; 12效果:
- 释放任何共享状态(30.6.4);
- move将rhs的内容分配给* this
问题第1部分完全取决于释放共享状态,例如在阅读§30.6.4之后,破坏共享状态,所以我猜这意味着第1部分应该是真的,但我不确定。
问题第2部分似乎是错误的,因为这是两个步骤,我既不知道移动部分是原子的,也不知道如果共享状态被销毁会发生什么而其他线程在shared_future::get()
。
答案 0 :(得分:1)
这些只是[futures.shared_future]中的注释,但它们是相关的:
[注意: shared_future 的成员函数不与自己同步,但它们与 共享共享状态。 -end note]
[...]
Thread 1 Signal Sigbrt
注意:对共享状态中存储的值对象的访问是非同步,因此程序员应该 仅应用
const R& shared_future::get() const; R& shared_future<R&>::get() const; void shared_future<void>::get() const;
上未引入数据竞争的操作(1.10)。
只要没有人拨打R
或以其他方式访问change()
,就可以调用read()
。