简单 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 种不同类型的输出。

  1. 只打印了 "Here"。
  2. "Here" 和 1 'sayHello' 条消息。
  3. "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

之后需要

pthread_join