Что делать, если поток завершает работу до того, как его ожидает другой поток?
Например, если я создаю 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
немедленно вернется (и уничтожит объект потока, как обычно).