在setcontext中出现分段错误



我正在做一些关于调度程序如何调度等待线程的测试,在这个过程中,我不想让操作系统看到一个等待线程,所以我杀死了一个等待锁的线程,并在锁被释放时启动它,我认为我应该保存线程的上下文,然后退出并在我再次创建它时恢复它。很明显我做错了什么,但我不知道是怎么回事。(我对这门学科很陌生。)

这是我的代码到目前为止,它产生分段错误与setcontext。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <ucontext.h>
ucontext_t data;
pthread_t pth;
pthread_mutex_t lock1;
void* wake_up(void* arg) {
    printf("going to wake up a threadn");
    setcontext(&data);
}
void MUTEX_UNLOCK(pthread_mutex_t* lock) {
    pthread_mutex_unlock(lock);
    pthread_create(&pth, NULL, wake_up, NULL);
}
void MUTEX_LOCK(pthread_mutex_t* lock) {    
    getcontext(&data);
    while(1) {      
        if(pthread_mutex_trylock(lock) == 0) {
            printf("got the lockn");
            break;
        }
        else {              
            printf("going to exit threadn");
            pthread_exit(NULL);
        }
    }
}
void* routine1(void* param) {
    MUTEX_LOCK(&lock1);
    printf("enter any character to continuen");
    getchar();
    MUTEX_UNLOCK(&lock1);
}
int main(int argc, char** argv) {
    pthread_mutex_init(&lock1, 0);
    pthread_t thread1[2];  
    int i; 
    for (i = 0; i < 2; i++)
        pthread_create(&thread1[i], NULL, routine1, NULL);  
    while(1);
}

setcontext在设置已退出线程的上下文时无效。(堆栈指针指向已释放的堆栈。)这就是为什么你会崩溃。

一般来说,getcontextsetcontext已经过时了,非常奇怪的函数不应该使用,除非您有关于协作(非pthread)多线程的非常具体的需求。虽然你没有描述你想做什么,我99%肯定你不需要setcontext来做这件事。

相关内容

  • 没有找到相关文章

最新更新