我正在测试一个调度程序如何调度一个等待的线程,在这个过程中,我想不让操作系统看到一个等待的线程,所以我杀了一个等待锁定的线程并在启动时启动它锁被释放了,我想我应该在退出之前保存线程的上下文,并在我再次创建时恢复它。显然我做错了但我无法弄清楚。 (我对这个问题很新。)
这是我的代码到目前为止,它使用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);
}
答案 0 :(得分:1)
setcontext
无效。 (堆栈指针指向已被释放的堆栈。)这就是为什么你会崩溃的原因。
更一般地说,getcontext
和setcontext
是过时的,并且非常奇怪的函数不应该使用,除非您对协作(非pthreads)多线程有非常具体的需求。虽然您还没有描述您尝试做什么,但我99%确定您不需要setcontext
来执行此操作。