简单 pthread 代码中的奇怪结果
A strange result in a simple pthread code
我写了下面的代码:
#include <pthread.h>
#include <stdio.h>
void* sayHello (void *x){
printf ("Hello, this is %d\n", (int)pthread_self());
return NULL;
}
int main (){
pthread_t thread;
pthread_create (&thread, NULL, &sayHello, NULL);
printf("HERE\n");
return 0;
}
编译后 运行 我看到了 3 种不同类型的输出。
- 只打印了 "Here"。
- "Here" 和 1 'sayHello' 条消息。
- "Here" 和 2 'sayHello' 条消息。
当然我可以接受第二个选项,但我不明白为什么如果我只创建一个线程,'sayHello' massege 可以打印 0 或 2 次?
你不能说线程什么时候开始 运行,它可能直到
after you return from main
这意味着进程将结束,线程也会随之结束。
您必须等待线程完成 pthread_join
,然后才能离开 main
。
第三种情况,线程的消息被打印两次,可能是因为线程执行了,缓冲区被写入stdout
作为行尾刷新的一部分,但是随后线程在刷新完成之前被抢占,然后进程存在,这意味着所有文件流(如 stdout
)都被刷新,因此再次打印文本。
对于输出 1:
你的 main
函数只创建一个 pthread,并让它 运行 而不等待它完成。
当你的main函数return时,操作系统会收回分配给pprocess的所有资源。然而,新创建的 pthread 可能没有 运行.
这就是为什么你只得到了 HERE
。
对于输出 2:
您新创建的线程在 main
函数 return 之前完成。因此您可以同时看到主线程和创建的线程的输出。
对于输出 3
这应该是 bug in glibc
. Please refer to Unexpected output in a multithreaded program 的详细信息。
使程序始终具有相同的输出
在 pthread_create
之后需要
我写了下面的代码:
#include <pthread.h>
#include <stdio.h>
void* sayHello (void *x){
printf ("Hello, this is %d\n", (int)pthread_self());
return NULL;
}
int main (){
pthread_t thread;
pthread_create (&thread, NULL, &sayHello, NULL);
printf("HERE\n");
return 0;
}
编译后 运行 我看到了 3 种不同类型的输出。
- 只打印了 "Here"。
- "Here" 和 1 'sayHello' 条消息。
- "Here" 和 2 'sayHello' 条消息。
当然我可以接受第二个选项,但我不明白为什么如果我只创建一个线程,'sayHello' massege 可以打印 0 或 2 次?
你不能说线程什么时候开始 运行,它可能直到
after you return from main
这意味着进程将结束,线程也会随之结束。
您必须等待线程完成 pthread_join
,然后才能离开 main
。
第三种情况,线程的消息被打印两次,可能是因为线程执行了,缓冲区被写入stdout
作为行尾刷新的一部分,但是随后线程在刷新完成之前被抢占,然后进程存在,这意味着所有文件流(如 stdout
)都被刷新,因此再次打印文本。
对于输出 1:
你的 main
函数只创建一个 pthread,并让它 运行 而不等待它完成。
当你的main函数return时,操作系统会收回分配给pprocess的所有资源。然而,新创建的 pthread 可能没有 运行.
这就是为什么你只得到了 HERE
。
对于输出 2:
您新创建的线程在 main
函数 return 之前完成。因此您可以同时看到主线程和创建的线程的输出。
对于输出 3
这应该是 bug in glibc
. Please refer to Unexpected output in a multithreaded program 的详细信息。
使程序始终具有相同的输出
在pthread_create
之后需要