简单的pthread代码

时间:2015-05-21 13:37:27

标签: c multithreading pthreads

我写了以下代码:

#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. 仅打印“此处”。
  2. “这里”和1'sayHello'消息。
  3. “这里”和2'sayHello'消息。
  4. 当然我可以使用第二个选项,但我不明白为什么如果我只创建一个线程,'sayHello'massege可以打印0或2次?

2 个答案:

答案 0 :(得分:6)

你不能说当线程开始运行时,它可能直到开始 之后从main返回,这意味着该过程将结束,并且该过程将结束。

在离开pthread_join之前,您必须等待线程完成main

第三种情况,来自线程打印两次的消息,可能是因为线程执行,并且缓冲区被写入stdout作为行尾刷新的一部分,但是线程是在刷新完成之前抢占,然后该进程存在,这意味着刷新所有文件流(如stdout),以便再次打印文本。

答案 1 :(得分:4)

对于输出1:

你的main函数只创建一个pthread,让它运行而不等待它完成。

当您的主函数返回时,操作系统将收回分配给pprocess的所有资源。但是新创建的pthread可能还没有运行。

这就是为什么你只有HERE

对于输出2:

main函数返回之前完成新创建的线程。因此,您可以看到主线程和创建的线程的输出。

输出3

这应该是glibc中的bug。有关详细信息,请参阅Unexpected output in a multithreaded program

使程序始终具有相同的输出

pthread_create

之后需要

pthread_join