setcontext中的分段错误

时间:2015-07-31 12:14:55

标签: c linux multithreading ucontext

我正在测试一个调度程序如何调度一个等待的线程,在这个过程中,我想不让操作系统看到一个等待的线程,所以我杀了一个等待锁定的线程并在启动时启动它锁被释放了,我想我应该在退出之前保存线程的上下文,并在我再次创建时恢复它。显然我做错了但我无法弄清楚。 (我对这个问题很新。)

这是我的代码到目前为止,它使用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 thread\n");
    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 lock\n");
            break;
        }
        else {              
            printf("going to exit thread\n");
            pthread_exit(NULL);
        }
    }
}

void* routine1(void* param) {
    MUTEX_LOCK(&lock1);
    printf("enter any character to continue\n");
    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);
}

1 个答案:

答案 0 :(得分:1)

设置已退出的线程的上下文时,

setcontext无效。 (堆栈指针指向已被释放的堆栈。)这就是为什么你会崩溃的原因。

更一般地说,getcontextsetcontext是过时的,并且非常奇怪的函数不应该使用,除非您对协作(非pthreads)多线程有非常具体的需求。虽然您还没有描述您尝试做什么,但我99%确定您不需要setcontext来执行此操作。