std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
Do std::promise::set_value() and std::future::wait() provide a memory fence?
如果我执行以下操作:
std::promise<void> p;
int a = 1;
std::thread t([&] {
a = 2;
p.set_value();
});
p.get_future().wait();
// Is the value of `a` guaranteed to be 2 here?
cppReference对set_value()
有这样的说法,但我不确定它是什么意思:
对此函数的调用不会引入对get_future调用的数据争用(但它们不需要彼此同步(。
set_value()
和wait()
是否提供获取/发布同步(或其他形式(?
从我的阅读来看,我相信a
最后保证是 2。请注意有关承诺本身的信息(强调我的(:
是 promise-future 通信通道的"推送"端:在共享状态下存储值的操作与(如 std::memory_order 中定义(从等待共享状态的任何函数(例如 std::future::get(的成功返回同步。对同一共享状态的并发访问可能会发生冲突,否则:例如,std::shared_future::get 的多个调用方必须全部为只读或提供外部同步。
当然,我鼓励你阅读某些东西同步的含义。对于这种情况,这意味着set_value
被视为线程间发生之前,因此从我所写的内容来看a
这是一个可见的副作用。您可以在此处找到更多信息。
你对get_future
的问话是什么意思?这意味着您可以安全地从不同的线程调用get_future
和set_value
,并且不会破坏任何东西。但它本身也不一定引入任何内存围栏。唯一确定和安全的同步点是从std::promise
set_value
,从std::future
get
相关文章:
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 使 std::vector 分配对齐内存的现代方法
- std::unordered_map析构函数不释放内存?
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- 在共享缓冲区内存中创建 ::std::string 对象
- 内存未释放 std::list<std::shared_ptr<std::string>> C++
- <char> 使用 Vulkan 映射内存时如何使用 std::vector 而不是 void**?
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 如何防止使用 std::shared_ptr 的代码中的内存泄漏
- C++ 中 std::vector 的内存问题
- std::set 是否将对象连续存储在内存中?
- 如何在窗口之间移动 std::unique_ptr 而不会冒内存泄漏的风险?
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- vector是否为std::移动的对象连续分配内存
- Valgrind 在 std::make_unique 中显示内存泄漏
- std::initializer_list 堆是否分配内存?
- std::unordered_set 中的元素如何存储在C++内存中?