线程同时读/写

Ben*_*n Y 2 c++ multithreading

如果我不关心同时的变化是否会Thread1发生变化,除了逻辑错误还有什么可担心的吗?如果:它会导致崩溃等:Flag1Thread2Flag1

  1. Thread1并在同一时间Thread2阅读Flag1
  2. Thread1正在读书Flag1的同时写信?Thread2Flag1

在这些例子中,Flag1是一个bool.

Jon*_*ely 7

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

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

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

  • C++ 03没有提到线程,因此无法保证**任何**工作.C++ 11提供了由编译器和硬件供应商商定的保证,并且主要代表现有实践的形式化.你有什么保证和不保证的更好的来源?我没有,所以只能回答C++ 11内存模型. (3认同)
  • @EitanT:问题被标记为"c ++ multithreading".在C++ 03中没有"线程"的概念,所以通过推断这必须是C++ 11,而Jonathan的答案是迄今为止唯一正确的答案.如果提问者想要了解某些特定于平台的线程模型,他需要识别该平台. (2认同)
  • @SvinSimpe,如果任何一个线程写入共享变量,则没有其他线程可以同时读取**或**写入它。只有并发读取才可以。 (2认同)