Почему поток просто умирает, если я не устанавливаю 'pthread_join'

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int count = 0;
pthread_mutex_t MUTEX = PTHREAD_MUTEX_INITIALIZER;

void* func1(void* a){
    pthread_mutex_lock(&MUTEX);
    for(;count < 4;count++){
        
        printf("LOOP 1: %d\n",count);
        sleep(1);
    }
    pthread_mutex_unlock(&MUTEX);
}

void* func2(void* a){
    pthread_mutex_lock(&MUTEX);
    for(;count < 8;count++){
        printf("LOOP 2: %d\n",count);
        sleep(1);
    }
    pthread_mutex_unlock(&MUTEX);
}

int main(){
    pthread_t tid[2];
    int a = 1;
    int status;

    if(pthread_create(tid,NULL,func1,(void*)&a))
        printf("func1 error\n");
    
    if(pthread_create(tid+1,NULL,func2,(void*)&a))
        printf("func2 error\n");

    //pthread_join(*tid, (void *) &status); 
    //pthread_join(*(tid+1), (void *) &status); 
}

простой код для проверки работы потока и мьютекса.

Если я запускаю код, он просто завершается, ничего не показывая (иногда просто одна строка LOOP 1: 0)

Если я раскомментирую

//pthread_join(*tid, (void *) &status); 
//pthread_join(*(tid+1), (void *) &status); 

тогда это работает хорошо.

КАК это происходит? кто-нибудь, пожалуйста, объясните


person co_lin    schedule 21.11.2020    source источник
comment
Совет: tid[0] и tid[1] предпочтительнее *tid и *(tid+1).   -  person Barmar    schedule 21.11.2020
comment
Потоки уничтожаются, когда процесс завершается. Если вы не дождетесь их с помощью pthread_join(), процесс сразу же завершится.   -  person Barmar    schedule 21.11.2020
comment
мой плохой :( спасибо за ответ! это действительно помогло   -  person co_lin    schedule 21.11.2020
comment
Отвечает ли это на ваш вопрос? Когда использовать pthread_exit() и когда использовать pthread_join() в Linux?   -  person David Cullen    schedule 21.11.2020


Ответы (1)


pthread_join(t,...) ждет завершения потока t. Другими словами, вызов ...join не возвращается до тех пор, пока не завершится t.

Итак, ваш вопрос на самом деле касается того, что происходит в программе C, если функция main() возвращает значение, когда потоки, созданные pthread_create(...), все еще выполняются.

Ответ (по крайней мере, для некоторых версий C)* состоит в том, что после того, как main() возвращает некоторое значение, v, библиотека вызывает exit(v). Вы можете заглянуть в справочные страницы или в документацию для любой системы, на которой вы работаете, чтобы узнать, что еще делает exit(...), но одна из вещей, которые она делает, это то, что она завершает весь процесс, включая все его потоки.


* Я не уверен на 100%, что каждая версия C и стандартные библиотеки C ведут себя таким образом, но я привык ожидать именно такого поведения.

Также обратите внимание, что такое поведение отличается от современного C++, где экземпляры std::thread могут продолжать работать даже после возврата main(...).

person Solomon Slow    schedule 21.11.2020