Какой механизм используется std :: thread для блокировки и ожидания завершения потока ОС / оборудования до sh? - PullRequest
1 голос
/ 04 апреля 2020

Я не имею в виду вызов join (). Я заинтересован в механике того, что происходит в join (). Я предполагаю, что должен быть системный вызов ОС, который не вернется, пока аппаратный поток не завершится. И как рутина ОС сигнализирует о завершении определенного потока. Просто концептуальное понимание.

1 Ответ

1 голос
/ 04 апреля 2020

Планировщик задач ОС поддерживает состояние для каждого существующего потока. Это состояние указывает, работает ли поток, готов ли он к выполнению, ожидает чего-либо и т. Д. c. Всякий раз, когда ядро ​​ЦП становится свободным, планировщик просматривает свой список, чтобы найти следующий готовый поток.

Когда поток вызывает std::thread::join, он в конечном итоге отправляет системный вызов ядру ОС, который говорит: «Я» жду нить Х ". Когда ядро ​​получает этот системный вызов, оно переводит поток в состояние ожидания и не планирует его запуск до тех пор, пока поток X не завершится. Когда поток X завершается, ОС помечает ожидающий поток как готовый к запуску, чтобы можно было запустить его в следующий раз, когда процессор освободится.

Точный механизм зависит от рассматриваемой ОС, но концепции быть похожим практически на любую ОС. Например, Linux std::thread::join в итоге вызывает pthread_join, что в итоге делает системный вызов FUTEX_WAIT для ожидания рассматриваемого потока. На Windows он позвонит на WaitForSingleObjectEx.

...