以下打印
In Main()
Hello World
Hello World
为什么打印Hello World两次?如果我使用pthread_join(),则会发生所需的输出(只有一个Hello World以In Main()开头。
#include <pthread.h>
void *thread_func(void *arg);
int main(int argc, char **argv)
{
int s;
void *res;
pthread_t t1;
s = pthread_create(&t1, NULL, thread_func, "Hello World\n");
if (s != 0)
printf("Err\n");
printf("In Main()\n");
s = pthread_detach(t1);
if (s != 0)
printf("Err\n");
return 0;
}
void *thread_func(void *arg)
{
char *s = (char *)arg;
printf("%s", s);
pthread_exit(0);
}
我理解pthread_detach告诉库一旦线程被终止就释放pthread使用的所有资源......并且因为我在thread_func结束时终止它,一切都应该没问题呢?
我在这里缺少什么?
答案 0 :(得分:3)
在我看来,您使用的是标准库的非线程安全版本(print,fflush ...)。我已经在旧的类Unix实时系统上看到过这种(显然)非逻辑行为。有两个不同版本的std库,一个用于单线程模式,另一个用于多线程模式。当然,默认是单线程... 通常,应该使用互斥锁序列化对文件指针和类似事物的访问。在你的程序中有两个线程终结点,每个终端可能想要隐式调用fflush,但由于底层缓冲区不是要同时访问的,因此可能会发生两次刷新都将相同的数据写入输出文件描述符。