gpt4 book ai didi

c - 实现用户级线程库——从 makecontext 返回值

转载 作者:太空宇宙 更新时间:2023-11-03 23:48:05 24 4
gpt4 key购买 nike

我看到了一些关于用户线程库的问题,但似乎没有一个能回答我的问题。我能够创建线程、运行它们、取消它们以及退出它们。由于某种原因我不能做的是让线程返回数据。

当我初始化我的线程库时,我将我的退出线程上下文设置如下:

getcontext(&threadEnd);
threadEnd.uc_stack.ss_sp = (char *)malloc(SIGSTKSZ);
threadEnd.uc_stack.ss_size = SIGSTKSZ;
makecontext(&threadEnd, (void *) thread_exit, 1, &ReturnValue);

我创建一个线程并按如下方式分配它:

thread->myContext.uc_stack.ss_sp = (char *) malloc(SIGSTKSZ);
thread->myContext.uc_stack.ss_size = SIGSTKSZ;
thread->myContext.uc_link = &threadEnd;

当函数返回并调用 thread_exit() 时:

    void thread_exit(void* retval){
int* test;
if (retval != NULL)
{
test = (int*) retval;
printf("Returned value: %i\n", *test);
fflush(stdout);
}

打印输出总是“返回值:0”

被调用函数返回一个指向整数的指针。

我做错了什么?

最佳答案

如果您在 GBD makecontext 中单步执行您的程序,请不要保存用于创建上下文的函数的返回值。

我的实验示例:(观察 rax 寄存器):

返回语句:

thread1 (arg=0x1) at test_create_join.c:14
14 return (void *)11;
Value returned is $1 = 19
(gdb) info registers
rax 0x13 19
---

返回后:

(gdb) step
15 }
(gdb) info registers
rax 0xb 11

内部上下文切换:

__start_context () at ../sysdeps/unix/sysv/linux/x86_64/__start_context.S:32
32 ../sysdeps/unix/sysv/linux/x86_64/__start_context.S: No such file or directory.
(gdb) info registers
rax 0xb 11

你可以看到一些指令的返回值被保留,但在几步之后它变成了 0。显然它特定于 x86_64 arch 但我认为它可能与大多数 arch 相同(即 makecontext 的行为)

现在,如果您需要线程函数的返回值,您可以采用另一种方式。只需创建一个线程处理程序来运行您的线程,并使用该处理程序来创建新的上下文。在这里,您可以获得要作为线程运行的函数的返回值,并将其保存在您的线程控制 block 结构中供以后使用。

typedef struct {
thread_start_routine start;
void *arg;
} entry_point;

static void thread_runner(void *args) {
exit_critical_section();

entry_point *entry = (entry_point *) args;

// run the thread and get the exit code
current->retcode = entry->start(entry->arg);
}

关于c - 实现用户级线程库——从 makecontext 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27978960/

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