此代码是否正确同步
Is this code correctly synchronized?
我想知道这段代码是否正常:
#include <iostream>
#include <future>
struct Foo
{
Foo()
:m_a(0)
{
}
int m_a;
};
int main()
{
Foo f;
auto handle =
std::async( std::launch::async,
[](Foo* f) { std::cout << f->m_a << 'n'; } ,
&f
);
handle.get();
}
我认为m_a
应该受到同步机制的保护,但我的同事说没有必要。
编辑:澄清我的问题:我担心来自Foo()
构造函数的STORE操作发生在来自另一个线程的LOAD操作之后。我看不出有什么机制阻止编译器按此顺序执行这些指令。
编辑:我相信一个热情的编译器可以决定内联构造函数,并在CALL操作之后延迟STORE操作以std::async
。在这种情况下,第二个线程可以在m_a
提交到内存之前访问它。
是的,这是正确同步的。
从 async
的规范中,C++11 30.6.8/5:
async
的调用与f
的调用同步。
其中f
是要async
的函数参数(示例中的 lambda)。
f.m_a
的初始化是在调用async
之前进行的,因此在异步函数的任何访问之前。
此外
函数 f 的完成在共享状态准备就绪之前进行排序。
因此,访问必须在调用 get()
返回之前进行,因此在销毁对象之前。
相关文章:
- 与 stdio 同步是否使程序 I/O 非交互式?
- ofstream::close() 是否在 Linux 上调用同步?
- 原子获取是否与互斥锁释放同步?
- 如何检查 ntpd 是否仍在运行和同步
- 顺序一致的原子负载(负载-负载对)是否形成线程间同步点
- Vulkan是否需要在多个具有透明度的平局调用之间进行同步
- 这种基于线程 ID 的同步是否安全整洁?
- 多个线程/进程是否可以在不同步的情况下同时从/写入文件的非重叠区域?
- 是否有一种缓冲方法进行同步
- future::wait() 是否与 async() 执行线程的完成同步?
- UWP 是否有同步文件读/写 API
- 使用 P/调用传递取消标志时是否需要同步
- C++:带有"std::lock_guard"的互斥锁是否足以同步两个"std::thre
- 使用boost :: Beast进行CPU重的REST API,我是否应该使用异步或同步方式来实现它们以期望延迟
- 我们是否需要在C++中同步局部对象变量
- RAII 是否可以在不同步的情况下有效地在线程之间共享不可变对象
- 此代码是否正确同步
- QFileInfo 是否与文件同步
- “std::mutex”和“std::lock”是否保证处理器间代码中的内存同步
- 使用不同的线程访问不同的子数组而不同步是否安全