std::thread 阻塞并等待 OS/hardware 线程完成的机制是什么?

What is the mechanism used by std::thread to block and wait for the OS/hardware thread to finish?

我不是说调用 join()。我对 join() 中发生的事情的机制很感兴趣。我假设必须有一个对 OS 的系统调用,在硬件线程完成之前不会 return。以及如何向 OS 例程发出特定线程已完成的信号。只是概念上的理解。

OS 的任务调度程序维护每个存在的线程的状态。此状态指示线程是否处于 运行ning、准备好 运行、正在等待某事等。每当 CPU 内核空闲时,调度程序会查看其列表以找到下一个就绪的内核线程。

当线程调用 std::thread::join 时,它最终会向 OS 内核分派系统调用 "I'm waiting on thread X"。当内核接收到该系统调用时,它将线程移至等待状态并避免将其调度到 运行 直到线程 X 终止。当线程 X 退出时,OS 会将等待线程标记为 运行 准备就绪,以便在下一次 CPU 释放时考虑 运行。

确切的机制取决于所讨论的 OS,但几乎所有 OS 的概念都是相似的。例如,在 Linux 上 std::thread::join 最终调用 pthread_join,最终执行 FUTEX_WAIT syscall to wait for the thread in question. On Windows, it will make a call to WaitForSingleObjectEx.