Планировщик задач ОС поддерживает состояние для каждого существующего потока. Это состояние указывает, работает ли поток, готов ли он к выполнению, ожидает чего-либо и т. Д. c. Всякий раз, когда ядро ЦП становится свободным, планировщик просматривает свой список, чтобы найти следующий готовый поток.
Когда поток вызывает std::thread::join
, он в конечном итоге отправляет системный вызов ядру ОС, который говорит: «Я» жду нить Х ". Когда ядро получает этот системный вызов, оно переводит поток в состояние ожидания и не планирует его запуск до тех пор, пока поток X не завершится. Когда поток X завершается, ОС помечает ожидающий поток как готовый к запуску, чтобы можно было запустить его в следующий раз, когда процессор освободится.
Точный механизм зависит от рассматриваемой ОС, но концепции быть похожим практически на любую ОС. Например, Linux std::thread::join
в итоге вызывает pthread_join
, что в итоге делает системный вызов FUTEX_WAIT
для ожидания рассматриваемого потока. На Windows он позвонит на WaitForSingleObjectEx
.