gpt4 book ai didi

c - C 中非 volatile 变量的限制

转载 作者:行者123 更新时间:2023-11-30 15:48:28 26 4
gpt4 key购买 nike

我想了解编译器对 C 中的非 volatile 变量有哪些限制(如果有的话)。

我不确定这是否属实,但有人告诉我,如果您有以下代码:

int x;
...
void update_x() {
lock();
x = x*5+3;
unlock();
}

您必须获取锁才能读取 x,因为即使很困难,编译器也不太可能这样做,将中间计算(例如 x*5)存储到 x 中在技术上是合法的,因此读取可能会读取中间值。所以我的第一个问题是事实是否如此?如果没有,为什么不呢?

如果是,我有一个后续问题,是否有什么东西可以阻止编译器在获取锁定之前或之后使用 x 作为临时存储? (假设编译器可以证明执行程序的单个线程不会注意到它)。

如果不是,这是否意味着任何具有非 volatile 共享变量的程序在技术上都是未定义的,即使所有访问都受锁保护?

谢谢,伊利亚

最佳答案

在 C11 之前,答案是否定的,因为规范没有定义有关多线程功能的任何内容,因此任何使用多线程(其中一个线程写入对象而另一个线程读取对象)的程序都是未定义的行为。

对于 C11,实际上存在一个讨论多线程和数据竞争的内存模型,所以答案是肯定的,只要锁定/解锁例程执行某些同步操作(涉及执行同步的库函数或对特殊的_Atomic对象)。

由于 C11 规范试图对现有实现的行为进行编码(大部分),因此很可能任何执行其所需操作的代码(即,使用实现提供的库进行锁定,或实现提供原子扩展)操作)即使在 C11 之前的实现上也能正常工作。

C11 规范的第 5.2.1.4 节涵盖了这一点。

关于c - C 中非 volatile 变量的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16796976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com