1

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

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

1 回答 1

0

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

更一般地说,getcontext它们setcontext是过时且极其奇怪的函数,除非您对协作(非 pthread)多线程有非常特殊的需求,否则不应使用它们。虽然你没有描述你想要做什么,但我 99% 确定你不需setcontext要这样做。

于 2015-07-31T12:30:16.280 回答