Что делать, если поток завершает работу до того, как его ожидает другой поток?

Например, если я создаю 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);

2 ответа

Решение

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

pthread_join(&tid1, NULL);

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

pthread_join(&tid2, NULL);

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

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

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

Другие вопросы по тегам