Функция 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;
}