2

如果我不在乎变化是否Thread1同时Flag1变化Thread2Flag1除了逻辑错误还有什么需要担心的吗?如果出现以下情况,是否会导致崩溃等:

  1. Thread1并同时Thread2阅读Flag1
  2. Thread1是在读Flag1的同时写吗?Thread2Flag1

在这些示例中,Flag1bool.

4

3 回答 3

8

根据C++11内存模型的规则:

  1. Thread1 和 Thread2 同时读取 Flag1?这总是安全的。
  2. Thread1 正在写入 Flag1,而 Thread2 正在读取 flag1?这是一场数据竞赛。

数据竞争是未定义的行为。虽然它不太可能在任何健全的硬件上崩溃,但它是未定义的行为,所以任何事情都可能发生。

于 2012-05-21T00:04:28.210 回答
2

据我所知,2个线程不能在完全相同的时间访问相同的内存。

即使在并行计算中,这些假设也会由处理器自动处理。 http://en.wikipedia.org/wiki/Parallel_Random_Access_Machine

所以答案是没有崩溃。您当然会遇到逻辑错误,但因为您不在乎:p。

于 2012-05-20T23:36:04.340 回答
-1

该标志应标记为volatile。这将确保您的编译器不会以不一致的方式优化读/写。

我相信对 bool 的读/写是原子的——所以如果你不关心访问顺序,我认为你不会有任何其他问题。

于 2012-05-20T23:32:51.813 回答