Завершение потоков

Последнее обновление: 06.02.2024

Функция 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;
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850