std::shared_future操作符=线程安全性/原子性

std::shared_future operator= thread safety/ atomic?

本文关键字:线程 安全性 原子性 操作符 shared future std      更新时间:2023-10-16

一般问题: std::shared_future::operator=原子

例如

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部分当左侧(例如旧shared_future(尚未在/异步提供程序上等待时,是否可以调用std::shared_future::operator=?就像object::change()中一样。

问题第2部分当其他异步返回对象/并发调用std::shared_future.get()的线程时,是否可以调用std::shared_future::operator=?像object::read()一样?编辑:忘记object::read(),我的意思是当然有自己的std::shared_future,但相同的共享状态

阅读C++11草案N3485§30.6.7:12 后

shared_future&运算符=(shared_future&&rhs(noexcept;12效果:

--释放任何共享状态(30.6.4(;

--move将rhs的内容分配给*this

问题第1部分仅取决于释放共享状态,例如,在阅读§30.6.4之后,破坏共享状态,所以我想这意味着第1部分应该是真的,但我不确定。

问题第2部分似乎是错误的,因为这是两个步骤,我既不知道移动部分是否是原子的,也不知道如果共享状态被破坏,而其他线程处于shared_future::get()中,会发生什么。

这些只是[futures.shared_future]中的票据,但它们是相关的:

[注意:shared_future的成员函数不与自身同步,但与同步共享共享状态--尾注]

[…]

const R& shared_future::get() const;
R& shared_future<R&>::get() const;
void shared_future<void>::get() const;

注意:对存储在共享状态下的值对象的访问是不同步的,因此程序员应该仅在R上应用那些不引入数据竞赛(1.10(的操作

因此,只要没有人在呼叫read()或以其他方式访问sf,呼叫change()就可以。