我想检查 astd::thread
是否已完成执行。搜索 stackoverflow 我发现以下问题解决了这个问题。接受的答案建议让工作线程在退出之前设置一个变量并让主线程检查这个变量。这是此类解决方案的最小工作示例:
#include <unistd.h>
#include <thread>
void work( bool* signal_finished ) {
sleep( 5 );
*signal_finished = true;
}
int main()
{
bool thread_finished = false;
std::thread worker(work, &thread_finished);
while ( !thread_finished ) {
// do some own work until the thread has finished ...
}
worker.join();
}
对已接受的答案发表评论的人声称,不能使用简单的bool
变量作为信号,代码在没有内存屏障的情况下被破坏并且使用std::atomic<bool>
是正确的。我最初的猜测是这是错误的,一个简单bool
的就足够了,但我想确保我没有遗漏任何东西。上面的代码是否需要astd::atomic<bool>
才能正确?
让我们假设主线程和工作线程在不同套接字的不同 CPU 上运行。我认为会发生的是,主线程thread_finished
从其 CPU 的缓存中读取。当 worker 更新它时,缓存一致性协议负责将 worker 更改写入全局内存并使主线程的 CPU 缓存无效,因此它必须从全局内存中读取更新的值。使上述代码正常工作的缓存一致性的全部意义不是吗?