我正在阅读Bjarne Stroustrup的C++ 11 FAQ,我无法理解内存模型部分中的示例.
他给出了以下代码片段:
// start with x==0 and y==0
if (x) y = 1; // thread 1
if (y) x = 1; // thread 2
Run Code Online (Sandbox Code Playgroud)
FAQ说这里没有数据竞争.我不明白.内存位置x由线程1读取并由线程2写入而没有任何同步(并且同样适用y).这是两次访问,其中一次是写入.这不是数据竞争的定义吗?
此外,它说"每个当前的C++编译器(我所知道的)给出了正确答案." 这个正确答案是什么?根据一个线程的比较是在另一个线程的写入之前或之后发生(或者另一个线程的写入是否对读取线程可见),答案是否会有所不同?
考虑这个代码,where x和y是整数:
if (x)
y = 42;
Run Code Online (Sandbox Code Playgroud)
是否允许以下编译器转换?
int tmp = y;
y = 42;
if (!x)
y = tmp;
Run Code Online (Sandbox Code Playgroud)
背景:
这是来自Bjarne Stroustrup的FAQ:
// start with x==0 and y==0
if (x) y = 1; // Thread 1
if (y) x = 1; // Thread 2
Run Code Online (Sandbox Code Playgroud)
常见问题解答说这是数据竞争免费; 使用x和y0都不应该写入任何变量.
但如果允许转换怎么办?