了解pthread_detach

以下打印

In Main() Hello World Hello World 

为什么打印Hello World两次? 如果我使用pthread_join(),则会发生所需的输出(只有一个Hello World以In Main()开头。

 #include  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结束时终止它,一切都应该没问题吧?

我在这里想念的是什么?

在我看来,你使用的是标准库的非线程安全版本(print,fflush …)。 我已经在旧的类Unix实时系统上看到过这种(显然)非逻辑行为。 有两个不同版本的std库,一个用于单线程模式,另一个用于multithreading模式。 当然,默认是单线程…通常,对文件指针和类似事物的访问应该使用互斥锁序列化。 在你的程序中有两个线程终结点,每个终端可能想要隐式调用fflush,但由于底层缓冲区不是要同时访问,因此可能会发生两次刷新都将相同的数据写入输出文件描述符。