簡體   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