了解pthread_detach

Joh*_*ock 11 c pthreads

以下打印

In Main()
Hello World
Hello World
Run Code Online (Sandbox Code Playgroud)

为什么打印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);
}
Run Code Online (Sandbox Code Playgroud)

我理解pthread_detach告诉库一旦线程被终止就释放pthread使用的所有资源...并且因为我在thread_func结束时终止它,一切都应该没问题吧?

我在这里错过了什么?

Giu*_*ini 3

在我看来,您正在使用标准库的非线程安全版本(prints、fflush...)。我已经在旧的类 UNIX 实时系统上看到过这种(显然)非逻辑行为。std 库有两种不同的版本,一种用于单线程模式,一种用于多线程模式。当然,默认是单线程的......一般来说,对文件指针和类似事物的访问应该使用互斥体进行序列化。在您的程序中,有两个线程终止,每个线程可能都想隐式调用 fflush,但由于底层缓冲区不应该同时访问,因此两个刷新可能会将相同的数据写入输出文件描述符。