Я не уверен, какую книгу вы читаете, но вы должны немедленно прекратить ее читать. Прежде всего, вы не можете гарантировать, что поток будет запущен и запущен до входа в цикл в main
. Это может начаться до или после. Во-вторых, отсутствует синхронизация доступа при доступе к переменной x
из двух разных потоков, поэтому нет гарантии, какое значение она будет иметь. Вызов printf
синхронизируется с stdout
объектом, а вызов sleep
заменяет поток, и для его повторного планирования требуется много времени. Этот пример бесполезен, и предположения о выводе неверны.
Теперь несколько ответов ..
Теперь не должен быть первый из них Тема 2 говорит 1, так как
pthread_create () перед циклом while в main.
Не обязательно. Требуется много циклов ЦП, чтобы запустить другой поток. Таким образом, наиболее вероятно, что вы введете цикл while
в main
до запуска этого другого потока. Но не обязательно.
Также, как здесь работает сон?
Сообщает ядру не выполнять вызывающий поток в течение заданного количества секунд. Фактическое время ожидания может быть немного больше из-за накладных расходов, связанных с планированием. На другие потоки это не влияет (да, но не напрямую, т. Е. Другие потоки могут иметь больше процессорного времени и т. Д.).
какой процесс выполняется, когда исполняющий поток спит?
Процесс никогда ничего не выполняет. Это расписание ядра, которое выполняет процессы (и потоки). По умолчанию процесс состоит из одного основного потока, и ядро выполняет его. Когда вы создаете больше потоков, планировщик выполняет больше потоков внутри процесса и т. Д. Когда один или несколько потоков спят, планировщики запускают те, которые не спят. Думайте о потоках как о процессах, совместно использующих одно и то же адресное пространство - вот чем они являются.