gpt4 book ai didi

c - Linux中的线程/进程机制

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:18 24 4
gpt4 key购买 nike

我的问题是关于赋予创建的线程的 PC 寄存器值。

如果我使用 fork() 创建一个新进程,PC 值将从父进程复制到子进程,因为 PC 值是代码中的下一个命令。

但是如果我创建一个新线程如下

#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg)

与:

err = pthread_create(&thready, NULL, &doSomeThing, NULL);

我只是简单地命令线程使用一个过程运行,但我不明白创建的线程从哪里获得它的 PC 值?这肯定不是父亲 PC。 PC值如何设置到doSomeThing代码的第一行?

最佳答案

(粗略地)它的 PC 设置为您提供的函数的地址。实际上它被设置为一些调用你的函数的 stub 。在那个 stub 中有一些对系统例程的调用,该例程设置了支持系统中的线程所需的一切。 PC 的精确设置方式因内核和硬件而异。如果您对系统代码感到满意,您可以浏览 Linux 内核源代码以了解这是如何完成的。

例如,glibc 2.0 有一个 start_thread 函数,它获取系统构建的 struct pthread 的地址(该例程是 stub )。在该函数中调用了一些宏 CALL_THREAD_FCT(thread_struct_address) ,其目的是开始运行您的函数。它对 i386 平台的定义是:

#define CALL_THREAD_FCT (       descr   )   \
({ void *__res; \
int __ignore1, __ignore2; \
asm volatile ("pushl %%eax\n\t" \
"pushl %%eax\n\t" \
"pushl %%eax\n\t" \
"pushl %%gs:%P4\n\t" \
"call *%%gs:%P3\n\t" \
"addl $16, %%esp" \
: "=a" (__res), "=c" (__ignore1), "=d" (__ignore2) \
: "i" (offsetof (struct pthread, start_routine)), \
"i" (offsetof (struct pthread, arg))); \
__res; })

参见 http://fossies.org/dox/glibc-2.20/pthread__create_8c_source.html例如。

关于c - Linux中的线程/进程机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26847957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com