Я прочитал, что main () - это один поток
Нет, вы неправильно поняли. Каждая C программа имеет функцию с именем main()
. C языковая семантика программы начинается с первоначального входа в эту функцию. В этом смысле, особенно когда вы ставите круглые скобки, main()
является функцией, а не потоком.
Однако каждый процесс также имеет основной поток , который имеет несколько свойств что отличает guish это от других тем. Изначально это единственный поток, так что именно этот поток выполняет начальную запись в функцию main()
. Но это также тот поток, который выполняет все функции C, вызываемые main()
, и этими функциями et c., Так что, как правило, c не указывает на выполнение только код, появляющийся непосредственно в теле main()
, если это то, что вы подразумеваете под "main (), сам по себе один поток".
, поэтому, когда я создаю 2 потока в моей программе, как это; [...] Является ли main действительно потоком в этом случае?
В этом случае действительно существует основной поток, отделенный от двух дополнительных потоков, которые он запускает.
в этом случае, если основной в течение некоторого времени находится в спящем режиме, разве основной не должен отдавать ЦП другим потокам?
Если основной поток спал, пока один из двух других был жив, тогда да, можно ожидать, что один или оба других получат (больше) процессорного времени. И в некотором смысле это именно то, что происходит: основной поток вызывает pthread_join()
для каждого из остальных потоков по очереди, что заставляет его ждать (некоторые скажут «спит»), пока эти потоки не завершатся, прежде чем он продолжится. Пока он ожидает, он не конкурирует с другими потоками за процессорное время, так как это в значительной степени означает «ожидание». Но к тому времени, когда основной поток достигает вызова Sleep()
в вашей программе, другие потоки уже завершены и присоединены, потому что это то, что делает pthread_join()
. Они больше не существуют, поэтому, естественно, они не запускаются во время Sleep()
.
Является ли main сами по себе потоками?
Есть основной поток, да и он единственный в вашем конкретном процессе, который выполняет любой код в функции main()
. Ничто не выполняется, кроме как в каком-то потоке или другом.
Я немного запутался здесь. Есть ли определенный c порядок выполнения основного потока?
Как уже было сказано, основной поток изначально является единственным потоком. Многие программы никогда не имеют больше, чем эта. Потоки, отличные от основного, создаются только основным потоком или другим потоком, который уже был создан. Конечно, потоки не могут работать до того, как они будут созданы, или, по определению, после того, как они завершены. Потоки выполняются независимо друг от друга, как правило, без какого-либо заранее определенного порядка, за исключением случаев, когда это явно устанавливается с помощью объектов синхронизации, таких как мьютексы, с помощью специальных функций, таких как pthread_join()
, или с помощью совместных операций над различными объектами ввода-вывода, такими как каналы.