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

时间:2015-03-12 18:20:57

标签: c++ c multithreading

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

1 个答案:

答案 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的指针队列,然后从那里继续。