C 代码 : Can somebody explain why process ID printed is the same in this example?

标签 c multithreading pthreads pthread-join

<分区>



我已经尝试了很长时间来分析这个问题,但我只能得出一个答案——打印的进程 ID 会有所不同。但 gcc 正在打印相同的值。谁能解释为什么会这样?
请找到以下示例:

#include<stdio.h>
#include<pthread.h>

void *fun_t(void *arg)
{
    printf("%d\n",getpid());
    pthread_exit("Bye");
}

int main()
{
    pthread_t pt;
    void *res_t;
    if(pthread_create(&pt,NULL,fun_t,NULL) != 0)
        perror("pthread_create");
    if(pthread_join(pt,&res_t) != 0)
        perror("pthread_join");
    printf("%d\n",getpid());
return 0;
}


这是我的理解:
1. 将创建具有某些进程 ID 的新线程。
2. 一旦操作系统调度它就会开始执行传递的函数
3. pthread_join 会导致调用线程等待,直到新线程执行完毕。
4. 新线程将打印其进程ID(与主线程不同)。
5. res_t 指针将填充为存储“Bye”的起始地址(但不会被使用)。
6. 在主线程中,getpid()会导致printf打印主线程的PID,这与新线程已经打印的PID不同。
7. 程序终止。

有人可以告诉我哪里错了吗?我在 eclipse IDE(也是最新版本)上的 Windows(win 10 最新版本)的 gcc 编译器中运行它。

最佳答案

在同一进程上下文中运行的两个线程具有相同的 PID。线程的实现错误地为每个线程提供了自己的进程 ID,但这些实现已经过时了大约十年。

关于C 代码 : Can somebody explain why process ID printed is the same in this example?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53800808/

相关文章:

c++ - 奇怪的线程行为

c++ - 通过宏从函数定义(并声明和使用)全局变量

c - 如何在 VS Code 调试 session 中持续观察变量及其值?

c - 使用 mmap 使 int 数组对子进程可见

java - 如何在非事件派发线程中间提示确认对话框

C++ 线程安全累加器

C - pthread 函数重用 - 局部变量和竞争条件

c - 为什么此代码在动态分配期间会崩溃?

C: 由 popen() 函数执行的 Linux 命令不显示结果

java - 使用 synchronized 顺序执行线程