#include <iostream>
#include <thread>
#include <mutex>
int main()
{
std::atomic<bool> ready = false;
std::thread threadB = std::thread([&]() {
while (!ready) {}
printf("Hello from B\n");
});
std::this_thread::sleep_for(std::chrono::seconds(1));
printf("Hello from A\n");
ready = true;
threadB.join();
printf("Hello again from A\n");
}
这是 CppCon 演讲中的一个示例https://www.youtube.com/watch?v=F6Ipn7gCOsY&ab_channel=CppCon(最少 17 分钟)
目标是首先打印Hello from A
然后允许threadB
开始。很明显,应该避免忙等待,因为它会占用大量 CPU。
作者说while (!ready) {}
循环可以由编译器优化(通过将值ready
放入寄存器),因为编译器看到threadB
永远不会休眠,所以ready
永远不会改变。但是即使线程从不休眠,另一个线程仍然可以改变值,对吧?没有数据竞争,因为ready
它是原子的。作者声明这段代码是UB。有人可以解释为什么允许编译器进行这样的优化吗?