gpt4 book ai didi

c++ - 在简单情况下同时写入和读取 bool 值的危险

转载 作者:太空狗 更新时间:2023-10-29 19:53:32 25 4
gpt4 key购买 nike

我读过一些类似的问题,但那里描述的情况要复杂一些。

我有一个 bool b 在堆和两个线程中初始化为 false。我确实理解 bools 的操作不是原子的,但请阅读问题直到最后。

第一个线程只能设置一次b = true,并且不会对它做任何其他事情。第二个线程在循环中检查 b,如果它是 true,则执行一些操作。

我是否需要使用某种同步机制(如互斥锁)来保护b?如果我不这样做会发生什么?使用ints,当我同时读取和写入时,我显然可以获得任意值。但是对于 bools 只有 truefalse 我不介意一次得到 false 而不是 。它是潜在的 SIGSEGV 吗?

最佳答案

数据竞争会导致未定义的行为。就标准而言,允许符合规范的实现出现段错误。

在实践中,主要的危险在于没有同步,编译器会观察到读取器循环中足够多的代码,从而判断 b“永远不会改变”,并优化除第一次读取之外的所有代码值(value)。它之所以可以这样做,是因为如果它观察到循环中没有同步,那么它就会知道对该值的任何写入都将是数据竞争。允许优化器假设您的程序不会引发未定义的行为,因此允许假设没有来自其他线程的写入。

b 标记为 volatile 将在实践中阻止这种特定的优化,但即使在 volatile 对象上,数据竞争也是未定义的行为。调用优化器“看不到”的代码也会在实践中阻止优化,因为它不知道该代码是否修改了 b。当然,与仅编译时优化相比,链接时/整个程序优化有更少的优化器看不到。

无论如何,阻止在软件中进行优化并不能阻止在具有非一致性缓存的系统上的硬件中发生相同的事情(至少,所以我声称:其他人认为这是不正确的,而且通过缓存读取/写入需要volatile 访问。某些实现确实以这种方式运行)。如果您询问标准是怎么说的,那么硬件是否无限期地向您显示陈旧的缓存并不重要,因为行为仍然未定义,因此实现可能会破坏您的代码,而不管这个特殊 优化是打破它的东西。

关于c++ - 在简单情况下同时写入和读取 bool 值的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13135479/

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