所以我正在创建我自己的线程库并开始我有两个函数 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/