Что происходит, когда pthread_join комментируется?
#include <stdio.h>
#include "mythreads.h"
#include <stdlib.h>
#include <pthread.h>
void *
mythread(void *arg) {
printf("%s\n", (char *) arg);
return NULL;
}
int
main(int argc, char *argv[])
{
if (argc != 1) {
fprintf(stderr, "usage: main\n");
exit(1);
}
pthread_t p1, p2;
printf("main: begin\n");
Pthread_create(&p1, NULL, mythread, "A");
Pthread_create(&p2, NULL, mythread, "B");
// join waits for the threads to finish
//Pthread_join(p1, NULL);
//Pthread_join(p2, NULL);
printf("main: end\n");
return 0;
}
Это код из Remzi, глава 27. Играя, мне любопытно узнать, почему иногда в бегах я получаю букву А дважды. Я знаю, почему это происходит, потому что я не включил оператор соединения. Почему пропуск соединения должен вызывать это?
Мой вывод:
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out
main: begin
A
main: end
B
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out
main: begin
A
main: end
B
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out
main: begin
main: end
A
shubham@HP:~/OS/Code-Threads-Intro$ ./a.out
main: begin
main: end
B
A
A
1 ответ
Решение
Удаление вызова pthread_join()
не должно вызывать "А" печататься дважды. (За исключением ошибки в реализации.)
Но так как ваш fprintf()
звонки делятся одинаково FILE *
структура, они не могут быть не многопоточными. Как и почему они могут напечатать "A" дважды, зависит от деталей реализации вашей системы fprintf()
функция.