pthread_join 被评论时会发生什么?
What happens when pthread_join is commented?
#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 章的代码。我很想知道为什么有时在 运行 上我会打印两次 A。我知道为什么会这样,因为我没有包含连接语句。为什么要跳过加入导致这个?
我的输出:
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
删除对 pthread_join()
的调用不应导致 "A" 被打印两次。 (除非实施中存在错误。)
但是由于您的 fprintf()
调用共享相同的 FILE *
结构,它们可能不是多线程安全的。他们如何以及为什么可以打印 "A" 两次取决于系统 fprintf()
函数的实现细节。
#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 章的代码。我很想知道为什么有时在 运行 上我会打印两次 A。我知道为什么会这样,因为我没有包含连接语句。为什么要跳过加入导致这个?
我的输出:
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
删除对 pthread_join()
的调用不应导致 "A" 被打印两次。 (除非实施中存在错误。)
但是由于您的 fprintf()
调用共享相同的 FILE *
结构,它们可能不是多线程安全的。他们如何以及为什么可以打印 "A" 两次取决于系统 fprintf()
函数的实现细节。