相关疑难解决方法(0)

C++内存模型 - 此示例是否包含数据竞争?

我正在阅读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++编译器(我所知道的)给出了正确答案." 这个正确答案是什么?根据一个线程的比较是在另一个线程的写入之前或之后发生(或者另一个线程的写入是否对读取线程可见),答案是否会有所不同?

c++ memory-model c++11

12
推荐指数
2
解决办法
1503
查看次数

是否允许此编译器转换?

考虑这个代码,where xy是整数:

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)

常见问题解答说这是数据竞争免费; 使用xy0都不应该写入任何变量.
但如果允许转换怎么办?

c++ multithreading c++11 data-race

9
推荐指数
1
解决办法
336
查看次数

标签 统计

c++ ×2

c++11 ×2

data-race ×1

memory-model ×1

multithreading ×1