setcontext 中的分段错误

segmentation fault in setcontext

我正在做一些关于调度程序如何安排等待线程的测试,在这个过程中,我不想让 OS 看到等待线程,所以我杀死了一个正在等待的线程锁定并在释放锁时启动它,我认为我应该在退出之前保存线程的上下文并在我再次创建它时恢复它。显然我做错了什么,但我无法弄清楚。 (我对这个主题很陌生。)

到目前为止,这是我的代码,它使用 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);
}

setcontext 在设置已退出线程的上下文时无效。 (堆栈指针指向已释放的堆栈。)所以这就是您遇到崩溃的原因。

更一般地说,getcontextsetcontext 已过时并且 非常奇怪 不应使用的功能,除非您有非常具体的合作需求(非 pthreads)多线程。虽然您没有描述您想要做什么,但我 99% 确定您不需要 setcontext 来完成它。