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

标签 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() 中提供的函数。其次,当我将上下文推送到队列时出现段错误。我只是完全迷路了,希望能得到一些指导。谢谢。

最佳答案

要运行 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/

相关文章:

c++ - 如何使用 C++ STL 和 boost 判断两个排序 vector 是否相交

c++ - 如何优化同时多线程的代码?

c - 使用 C 程序从已识别的文本中仅搜索四个词

python - 在Python中获得__CPROVER_assert的效果?

multithreading - Docker 容器而不是多处理

c++ - C++动态调度机制及正确调用函数的过程

c++ - 将需要回调的函数调用转换为协程

c - 将函数参数保存在结构体数组中

python - 通过线程并行化缓慢的 api 调用

python - 如何在python中多线程调用另一个端点方法?