Yve*_*ves 2 c++ volatile undefined-behavior
根据我的理解,volatile- 合格价值意味着无论何时访问它们,我们都必须访问地址并获取最新值.
现在我正在阅读有效的现代C++这本书,我不明白为什么在volatile这里创建一个UB:
volatile int vi(0); // initialize vi to 0
vi = 10; // set vi to 10
std::cout << vi; // read vi's value
++vi; // increment vi to 11
vi--; // decrement vi to 10
Run Code Online (Sandbox Code Playgroud)
在执行此代码期间,如果其他线程正在读取vi的值,则它们可能会看到任何内容(例如,-12,68,4090727-任何内容!).这样的代码会有未定义的行为,因为这些语句会修改vi,所以如果其他线程同时读取vi,那么同时存在的读取器和写入器既不是std :: atomic也不是由互斥锁保护,这就是定义数据竞赛.
在我看来,如果其他主题可能看到0,10或11,我可以理解,但为什么这本书说"他们可能会看到任何东西"?