Если main является также потоком в c, почему он не работает с другими потоками - PullRequest
0 голосов
/ 05 марта 2020

Я прочитал, что main () сам по себе является одним потоком, поэтому, когда я создаю 2 потока в моей программе, как это;

#include<stdio.h>
#include<pthread.h>
#include<windows.h>

void* counting(void * arg){
    int i = 0;
    for(i; i < 50; i++){
        printf("counting ... \n");
        Sleep(100);

    }
}

void* waiting(void * arg){
    int i = 0;
    for(i; i < 50; i++){
        printf("waiting ... \n");
        Sleep(100);
    }
}

int main(){
    pthread_t thread1;
    pthread_t thread2;
    pthread_create(&thread1, NULL, counting, NULL);
    pthread_create(&thread2, NULL, waiting, NULL);
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    int i = 0;
    for(i; i < 50; i++){
        printf("maining ... \n");
        Sleep(1000);
    }


}

Является ли main в действительности потоком в этом случае? в этом случае, если основной в течение некоторого времени находится в спящем режиме, разве основной не должен передавать процессор другим потокам? Здесь есть основные темы? Я немного смущен здесь. Существует ли определенный c заказ на выполнение основного потока?

Ответы [ 3 ]

2 голосов
/ 05 марта 2020
 pthread_join(thread1, NULL);
 pthread_join(thread2, NULL);

Вы попросили поток дождаться завершения thread1, а затем дождаться завершения thread2, вот что он делает.

1 голос
/ 06 марта 2020

Я прочитал, что 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(), или с помощью совместных операций над различными объектами ввода-вывода, такими как каналы.

1 голос
/ 05 марта 2020

main() - это не поток, а функция, так что вот четкое «нет» вашей первоначальной претензии. Однако, если вы прочитаете несколько определений того, что является потоком, вы обнаружите, что это что-то, что можно запланировать, то есть непрерывное выполнение кода. Кроме того, работающая программа не сможет ничего сделать на самом деле без «постоянного выполнения кода» без, например, main() в качестве первой точки входа. Поэтому, безусловно, каждый код, выполняемый программой, выполняется потоком без исключений.

Кстати: вы можете получить идентификатор текущего потока. Попробуйте запустить это с main(). Он будет работать и даст вам значение, которое отличает этот вызов от вызовов других потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...