如何在退出前保存线程堆栈?
how to save a thread stack before it exits?
我正在处理一个多线程项目,我需要在代码中的某个位置制作一个线程堆栈的副本(我需要一个指向它的指针)。因为在这个线程退出后我将需要那个指针(并且它的堆栈被释放)。
如果我能以某种方式告诉 pthread_exit()
不要释放线程堆栈,它也会完成这项工作!
PS:这背后的原因是我想在这个线程实际上死了之后使用setcontext(ucontext_t*)
。
正如评论者所说,保存线程堆栈以便稍后恢复它真的很难。如果你需要的是防止线程被调用,你可以尝试 "pause" 它加锁。请参阅示例 here。
如前所述,这可能是 XY 问题的一个例子。但是,解决方案是在每个线程中使用一个pthread_mutex_t
。
创建线程的函数将创建 pthread_mutext_t
并将其传递给线程。
pthread_t tid;
pthread_mutext_t mutex;
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);
pthread_create(&tid, NULL, fun, &mutex);
// do stuff
pthread_mutex_unlock(&mutex);
线程函数如下...
void fun(void* arg) {
pthread_mutex_t* mutex = (pthread_mutex_t*) arg;
pthread_mutex_lock(mutex);
// do stuff
}
如果您需要异步执行此操作,您可以为 SIGUSR1
和 SIGUSR2
注册一个信号处理程序并使用 pause
取消调度线程。
signal(SIGUSR1, on_usr1);
signal(SIGUSR2, on_usr2);
void on_usr1(int sig) {
pause();
}
void on_usr2(int sig) {
}
然后使用pthread_kill
向线程发出信号...
pthread_kill(tid, SIGUSR1);
我正在处理一个多线程项目,我需要在代码中的某个位置制作一个线程堆栈的副本(我需要一个指向它的指针)。因为在这个线程退出后我将需要那个指针(并且它的堆栈被释放)。
如果我能以某种方式告诉 pthread_exit()
不要释放线程堆栈,它也会完成这项工作!
PS:这背后的原因是我想在这个线程实际上死了之后使用setcontext(ucontext_t*)
。
正如评论者所说,保存线程堆栈以便稍后恢复它真的很难。如果你需要的是防止线程被调用,你可以尝试 "pause" 它加锁。请参阅示例 here。
如前所述,这可能是 XY 问题的一个例子。但是,解决方案是在每个线程中使用一个pthread_mutex_t
。
创建线程的函数将创建 pthread_mutext_t
并将其传递给线程。
pthread_t tid;
pthread_mutext_t mutex;
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);
pthread_create(&tid, NULL, fun, &mutex);
// do stuff
pthread_mutex_unlock(&mutex);
线程函数如下...
void fun(void* arg) {
pthread_mutex_t* mutex = (pthread_mutex_t*) arg;
pthread_mutex_lock(mutex);
// do stuff
}
如果您需要异步执行此操作,您可以为 SIGUSR1
和 SIGUSR2
注册一个信号处理程序并使用 pause
取消调度线程。
signal(SIGUSR1, on_usr1);
signal(SIGUSR2, on_usr2);
void on_usr1(int sig) {
pause();
}
void on_usr2(int sig) {
}
然后使用pthread_kill
向线程发出信号...
pthread_kill(tid, SIGUSR1);