irs*_*sis 1 c++ multithreading boolean c++11
我知道这是未定义的行为。因此存在数据竞争或崩溃的可能性。可以使用atomicbool来避免这种可能性。我有兴趣了解有关碰撞安全的信息。
AFAIU,当一个线程读取另一个线程部分写入或撕裂的值时,可能会发生崩溃。另一方面, bool 的大小是由实现定义的,但让它大于数据模型中指针的大小几乎没有意义。
假设 bool 的内存块将被更新或不更新是否安全?因此,其他线程无法读取撕裂值,因此从不同线程读取/写入全局布尔值是安全的吗?
不,这不安全。未定义的行为是未定义的。没有规则说它不会崩溃,除非你能想出一种方法让它崩溃。我能想到它会崩溃的方法。
例如,假设您有一个函数,该函数创建一个线程,该线程从bool该函数写入的同一个线程中读取,而无需同步。由于这是 UB,编译器可以自由地假设永远不会调用该函数。甚至不需要为其生成任何代码。如果该函数由 an 调用if,则编译器可以假定if将始终采用 的另一个分支。
你甚至没有想过说“没有编译器会那么聪明”。很多人曾经说过这样的话,然后当编译器变得更聪明时就被烧毁了。在过去的一两年里,我见过几十个“那个新编译器破坏了我的代码”的案例,当然,代码一直都被破坏了。
已经有一些编译器将代码更改if (x > 2) y = 3; else y = 4;为类似y = 3; if (x <= 2) y = 4;. 在某些情况下,这甚至可以是一种优化。
不要故意制作损坏的代码。