相关疑难解决方法(0)

永远不会执行的代码可以调用未定义的行为吗?

调用未定义行为的代码(在此示例中,除以零)将永远不会执行,程序是否仍未定义行为?

int main(void)
{
    int i;
    if(0)
    {
        i = 1/0;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我认为它仍然是未定义的行为,但我在标准中找不到支持或否认我的任何证据.

那么,有什么想法吗?

c language-lawyer

79
推荐指数
3
解决办法
4316
查看次数

是什么从形式上保证了非原子变量不会看到空气中的稀疏值,并且在理论上可以像原子弛豫一样创建数据竞争呢?

这是有关C ++标准的形式保证的问题。

该标准指出,std::memory_order_relaxed原子变量规则允许“凭空” /“出乎意料”的值出现。

但是对于非原子变量,这个例子可以有UB吗?是否r1 == r2 == 42有可能在C ++抽象机?== 42最初都不是变量,因此您不希望任何if主体执行,这意味着不会写入共享变量。

// Global state
int x = 0, y = 0;

// Thread 1:
r1 = x;
if (r1 == 42) y = r1;

// Thread 2:
r2 = y;
if (r2 == 42) x = 42;
Run Code Online (Sandbox Code Playgroud)

上面的示例改编自标准,该标准明确表示原子对象规范允许这种行为

[注意:在以下示例中,要求确实允许r1 == r2 == 42,而x和y最初为零:

// Thread 1:
r1 = x.load(memory_order_relaxed);
if (r1 == 42) y.store(r1, memory_order_relaxed);
// …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading language-lawyer stdatomic data-race

3
推荐指数
3
解决办法
487
查看次数

标签 统计

language-lawyer ×2

c ×1

c++ ×1

data-race ×1

multithreading ×1

stdatomic ×1