繁体   English   中英

如何在用户级线程上运行功能?

[英]How do I run a function on a user level thread?

所以我要创建自己的线程库,首先要有两个函数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的指针队列,然后从那里继续。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM