Что, если поток завершится раньше, чем другой поток его дождется (присоединится)?

Например, если я создам 3 потока и присоединяюсь к ним в том же порядке. Если второй поток выйдет первым, что произойдет с pthread_join. Будет ли программа блокироваться до тех пор, пока tid1 не выйдет или не вернется напрямую из pthread_join (& tid2, NULL)?

   pthread_t tid1,tid2,tid3;
   pthread_create(&tid1, NULL, SomeFun, NULL);
   pthread_create(&tid2, NULL, SomeFun, NULL);
   pthread_create(&tid3, NULL, SomeFun, NULL);
   pthread_join(&tid1, NULL);
   pthread_join(&tid2, NULL);
   pthread_join(&tid3, NULL);

person user5574376    schedule 22.04.2016    source источник
comment
pthread_join() это не то, чего страшатся.   -  person EOF    schedule 22.04.2016


Ответы (2)


когда вы кодируете звонки:

pthread_join(&tid1, NULL);

если tid1 еще не завершился, этот вызов будет заблокирован, пока не завершится. если tid2 завершается тем временем, это не меняет поведения этого конкретного вызова. Но в этом сценарии, когда вызов действительно возвращается, следующий вызов:

pthread_join(&tid2, NULL);

вернется немедленно, так как tid2 уже вышел.

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

person Michael Burr    schedule 22.04.2016

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

person user253751    schedule 22.04.2016
comment
Таким образом, он сначала выполнит pthread_join (& tid1, NULL), а затем немедленно вернется из pthread_join (& tid2, NULL) и продолжит ждать tid3? - person user5574376; 22.04.2016