std::shared_future操作符=线程安全性/原子性
std::shared_future operator= thread safety/ atomic?
一般问题: 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()
就可以。
- 类与私有变量的其他类之间的线程安全性
- 调用socket.remote_endpoint(提升 asio 库)线程安全性
- std::lock_guard 似乎提供了线程安全性,尽管作用域块
- C++中向量和列表的非写入成员函数的线程安全性
- 线程安全性和静态变量/成员功能
- 是仅使用get或toplown的原始类型的线程安全性的威胁
- 提高 ASIO stream_descriptor和事件 FD 线程安全性
- OpenMP中树结构的线程安全性
- 静态变量初始化的线程安全性
- 从另一个(非 qt)线程调用 QObject 方法的线程安全性?
- C 共享_ptr如何确保线程安全性
- 编写std::vector与普通数组的线程安全性
- C++标准库容器相对于所包含对象的线程安全性
- 读取和写入操作的线程安全性C++
- Qt库-静态成员函数的线程安全性
- QObject可重入性和线程安全性
- std::map中的线程安全性
- boost::asio io_service 和 std::containers 的线程安全性
- C++11 std:原子<T>复制构造函数的线程安全性
- Clang 线程安全性分析和线程角色