Функция thread_join() позволяет перевести текущий поток (объект pthread_t ) в состояние ожидания, пока не завершится другой поток. Эта функция имеет следующий прототип:
int pthread_join(pthread_t thread, void **value_ptr);
Первый параметр представляет поток, завершения которого надо подождать. Второй параметр - указатель, через который мы можем получить результат потока.
При успешном выполнения эта функция возвращает 0, при возникновении ошибки - числовой код ошибки.
Используем функцию pthread_join()
для ожидания завершения потока:
#include <pthread.h> #include <stdio.h> #include <unistd.h> void* some_work(void* arg) { for(int i = 0; i < 3; ++i) { puts(arg); sleep(1); } return NULL; } int main(void) { pthread_t thread; pthread_create(&thread, NULL, some_work, "Hello World" ); pthread_join(thread, NULL); // ждем завершения потока thread printf("End...\n"); return 0; }
В данном случае ждем завершения потока thread, который выполняет функцию some_work. В данном случае результат потока не важен (тем более он возвращает NULL), поэтому и в
pthread_join()
передаем второму параметру значение NULL. В итоге мы получим следующий консольный вывод:
eugene@Eugene:~/Documents/metanit$ ./main Hello World Hello World Hello World End... eugene@Eugene:~/Documents/metanit$
Теперь используем результат:
#include <pthread.h> #include <stdio.h> #include <unistd.h> void* some_work(void* arg) { for(int i = 0; i < 3; ++i) { puts(arg); sleep(1); } return "Bye, World"; } int main(void) { pthread_t thread; void* thread_result; // для получения результата потока pthread_create(&thread, NULL, some_work, "Hello World" ); pthread_join(thread, &thread_result); // ждем завершения потока thread puts(thread_result); return 0; }
Здесь поток возвращает строку (значение char*
). Для получения этого результата в функции main определен указатель thread_result. А в функцию
pthread_join()
вторым аргументом передаем адрес этого указателя. В конце функции main выводит полученное значение:
eugene@Eugene:~/Documents/metanit$ ./main Hello World Hello World Hello World Bye, World eugene@Eugene:~/Documents/metanit$
Если у нас несколько потоков, завершения которых надо подождать, то для всех этих потоков можно вызвать pthread_join():
#include <pthread.h> #include <stdio.h> #include <unistd.h> void* some_work(void* arg) { for(int i = 0; i < 3; ++i) { puts(arg); sleep(1); } return "Bye, World"; } int main(void) { pthread_t thread1, thread2; pthread_create(&thread1, NULL, some_work, "Hello World" ); pthread_create(&thread2, NULL, some_work, "Hello METANIT.COM" ); pthread_join(thread1, NULL); // ждем завершения потока thread1 pthread_join(thread2, NULL); // ждем завершения потока thread2 puts("End..."); return 0; }