поведение pthreads и функции pthread_join - PullRequest
1 голос
/ 29 сентября 2010

Я новичок в многопоточном программировании и у меня есть вопрос о pthreads.

Это тестовый код, который я запускаю, и я не понимаю его поведение. Может кто-нибудь пролить свет на это, пожалуйста.

void *t1(void *args){  
    printf("returning from t1\n");  
    return;  
}  

void *t2(void *args){  
    printf("returning from t2\n");  
    return;  
}  

int main(){  
    pthread_t thread1,thread2;      
    int r1,r2;  
    r1=pthread_create(&thread1,NULL,t1,NULL);  
    r2=pthread_create(&thread2,NULL,t2,NULL);  

    pthread_join(thread1,NULL);    
 // pthread_join(thread2,NULL);   

    return 0;  
}  

Поведение этой программы одно из 5, показанных ниже

murtuza@murtuza:FFTW$ ./ptest  
returning from t2  
returning from t1  
murtuza@murtuza:FFTW$ ./ptest  
returning from t1  
returning from t2  
murtuza@murtuza:FFTW$ ./ptest  
returning from t1  
murtuza@murtuza:FFTW$ ./ptest  
returning from t2  
returning from t2  
murtuza@murtuza:FFTW$ ./ptest  
returning from t1  
returning from t2  
returning from t2  

Я не понимаю 4-й и 5-й выход. Почему поток t2 выполняется дважды? Конечно, если я раскомментирую pthread_join(&thread2,NULL,t2,NULL) программа будет работать правильно, но меня особенно интересует случай, когда к основному потоку присоединяется только один поток.

спасибо, Мир

Ответы [ 3 ]

1 голос
/ 30 сентября 2010

Возможно, что поток t2 НЕ выполняется дважды, но библиотека stdio печатает вывод дважды, потому что существует состояние гонки, когда два потока вызывают printf () без какой-либо блокировки.Вы можете попробовать вызвать вызовы printf () внутри пары pthread_mutex_lock () / pthread_mutex_unlock () (конечно, оба блокируют один и тот же мьютекс) и посмотреть, не вызывает ли это исчезновение симптома.

1 голос
/ 30 сентября 2010

Я думаю, вы хотите, чтобы мы объяснили неопределенное поведение здесь. Вы никогда не должны использовать какую-либо функцию библиотеки C после выхода из main(). Я думаю, что вы видите буферы очистки потока main(), когда он закрывает библиотеку C. Я думаю, что он может игнорировать любые блокировки потоков во время завершения работы.

1 голос
/ 30 сентября 2010

Боюсь, я не смог воспроизвести вашу проблему.

Я бегал:

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

void *t1(void *args){  
    printf("returning from t1\n");  
    return NULL;  
}  

void *t2(void *args){  
    printf("returning from t2\n");  
    return NULL;  
}  

int main(){  
    pthread_t thread1,thread2;      
    int r1,r2;  
    r1=pthread_create(&thread1,NULL,t1,NULL);  
    r2=pthread_create(&thread2,NULL,t2,NULL);  

    pthread_join(thread1,NULL);    
 // pthread_join(thread2,NULL);   

    return 0;  
}  

В

while (true) ; do ./ptest ; date ; done

И заметили: t1, t2; t2, t1 и t1.

Но никогда не повторяющиеся записи или пропущенные t1.

К сожалению.

Может быть, что-то сломано в вашей библиотеке потоков или при распечатке из многопоточного процесса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...