Позволяет ли pthread_join () выполнять выполнение в вызывающем потоке или нет? - PullRequest
4 голосов
/ 31 октября 2011

редактировать: Я сделал неверное предположение, что потоки начали работать на pthread_join, когда они фактически начали работать на pthread_create.


Я учусь использовать потоки Posix, и я прочитал это:
pthread_join() - wait for thread termination

Таким образом, в примере кода выход main (0) не достигается до тех пор, пока не завершатся оба запущенных потока.
Но после первого вызова pthread_join () main продолжает выполняться, потому что второй вызов pthread_join () фактически выполняется и печатается промежуточное сообщение.
Так как это? main продолжает выполняться, пока оба потока еще не завершены? или нет?
Я знаю, что это не надежный способ тестирования, но второе тестовое сообщение всегда печатается после завершения обоих потоков, независимо от того, какова длительность цикла. (по крайней мере, на моей машине, когда я попробовал)
void *print_message_function( void *ptr ) { char *message = (char *) ptr; for( int a = 0; a < 1000; ++a ) printf( "%s - %i\n", message, a ); return NULL; } // int main( int argc, char *argv[] ) { pthread_t thread1, thread2; char message1[] = "Thread 1"; char message2[] = "Thread 2"; int iret1, iret2; // iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2); // pthread_join( thread1, NULL); printf( "Let's see when is this printed...\n" ); pthread_join( thread2, NULL); printf( "And this one?...\n" ); // printf("Thread 1 returns: %d\n",iret1); printf("Thread 2 returns: %d\n",iret2); exit(0); }

Ответы [ 4 ]

6 голосов
/ 31 октября 2011

Функция pthread_join ожидает завершения потока или немедленно возвращается, если поток уже завершен.

Так что в вашем случае

pthread_join( thread1, NULL); /* Start waiting for thread1. */
printf( "Let's see when is this printed...\n" ); /* Done waiting for thread1. */

pthread_join( thread2, NULL); /* Start waiting for thread2. */
printf( "And this one?...\n" ); /* Done waiting for thread2. */

Но после первоговызов pthread_join (), main продолжает выполняться, потому что второй вызов pthread_join () фактически выполняется, и выводится промежуточное сообщение.

False.pthread_join ждет, пока не завершится нить1.

3 голосов
/ 31 октября 2011

pthread_join() не возвращает (блокирует вызывающий поток), пока присоединяемый поток не завершится.Если поток уже завершен, он сразу же возвращается.

В вашем тесте оба потока завершаются, и, конечно, вы увидите все сообщения, напечатанные из основного потока.Когда печатается первое сообщение, вы знаете, что thread1 завершено;когда печатается второе, вы знаете, что thread2 также завершено.Это, вероятно, произойдет довольно быстро после первого, поскольку оба потока выполняли одинаковый объем работы примерно в одно и то же время.

3 голосов
/ 31 октября 2011
pthread_join( thread1, NULL);

Главный поток ожидает здесь этого вызова соединения, пока thread1 не завершит свою работу.Как только thread1 завершит выполнение, основной поток продолжит работу и выполнит следующую инструкцию printf.

printf( "Let's see when is this printed...\n" );

Опять же, главный поток будет ждать здесь, пока thread2 завершит свою работу.

pthread_join( thread2, NULL); 

Как только thread2 завершит свою работу, основной поток продвигается вперед и выполняется следующий оператор, который является printf.

printf( "And this one?...\n" );

Последовательность будет работать в приведенном вышеупомянутым способом. Вероятно, это происходит слишком рано, потому что следы, которые вы видите, сбивают с толку.
Кроме того, не используйте printf, чтобы увидеть поведение многопоточных программ, может быть весьма обманчивым, порядок printf может не всегда указыватьправильный поток управления Поскольку он основан на синхронизации, и сброс буферов в стандартный вывод может не произойти в том же порядке, поскольку распечатки выполнялись по потокам.

2 голосов
/ 31 октября 2011

Если первый pthread_join возвращается немедленно, это предполагает, что первый поток уже завершил выполнение.Как выглядит вывод?Вы видите какой-нибудь вывод "Thread 1 - n" после "Давайте посмотрим, когда это будет напечатано"?

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