std :: shared_future operator = thread safety / atomic?

时间:2015-09-01 13:41:22

标签: c++ multithreading c++11 std future

一般问题: 是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()

1 个答案:

答案 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()

相关问题