所以我正在创建自己的线程库并开始我有两个函数 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()中提供的功能。其次,当我将上下文推送到队列时,我遇到了分段错误。我只是完全迷失了,并会欣赏一些方向。感谢。
答案 0 :(得分:1)
要在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
的指针队列,然后从那里继续。