gpt4 book ai didi

c++ - 如何在用户级线程上运行函数?

转载 作者:行者123 更新时间:2023-11-28 06:23:04 25 4
gpt4 key购买 nike

所以我正在创建我自己的线程库并开始我有两个函数 system_init()uthread create(void (* func)( ))第一个应该初始化我的程序来处理用户线程,第二个创建一个运行提供的函数的线程。这些功能如下:

#include <stdio.h>
#include <queue>
#include <ucontext.h>
#include <semaphore.h>
#include <unistd.h>



std::queue<ucontext_t> *readyQueue;
int numKernelThreads;
int numIOWaitingProcesses;
sem_t sem;

void system_init() {
numKernelThreads = 0;
numIOWaitingProcesses = 0;
sem_init(&sem, 0, 1);
}



int uthread_create(void (* func)()) {
ucontext_t context;
getcontext(&context);
makecontext(&context, func, 0);
readyQueue->push(context);
}

我遇到了一些问题。首先,我不知道如何运行我在 uthread_create() 中提供的函数。其次,当我将上下文推送到队列时出现段错误。我只是完全迷路了,希望能得到一些指导。谢谢。

最佳答案

要运行 uthread_create() 中的函数,您需要将 func 压入堆栈。用类似的东西初始化堆栈

char* stack = new char[STACK_SIZE];
context.uc_stack.ss_sp = stack;
context.uc_stack.ss_size = STACK_SIZE;

其中 STACK_SIZE 是一些预定义常量(常量 SIGSTKSZ 应该有效)。之后,将 func(及其相关参数)压入堆栈。

出现段错误的原因是 ucontext_t 类型包含指向自身的指针,当您将其直接插入队列时,您正在制作一个拷贝。然后,新拷贝指向旧数据成员,当旧数据成员被删除时,就会出现段错误。相反,创建一个指向 ucontext_t 的指针队列并从那里继续。

关于c++ - 如何在用户级线程上运行函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29017431/

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