1

我正在开发一个多线程项目,我需要在代码中的某个位置复制一个线程的堆栈(我需要一个指向它的指针)。因为在这个线程退出(并且它的堆栈被释放)之后我将需要那个指针。pthread_exit()如果我能以某种方式告诉不要释放线程堆栈,它也可以完成这项工作!

PS:这背后的原因是我想setcontext(ucontext_t*)稍后在这个线程实际上已经死了的时候使用。

4

2 回答 2

5

如前所述,这可能是 XY 问题的情况。但是,解决方案是pthread_mutex_t在每个线程中使用 a 。

创建线程的函数将创建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
}

如果您需要异步执行此操作,您可以为 和 注册一个信号处理程序,SIGUSR1SIGUSR2使用它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);
于 2015-07-31T16:38:35.070 回答
1

正如评论者所说,保存一个线程堆栈以便以后恢复它真的很难。如果您需要阻止线程被调用,您可以尝试用锁“暂停”它。请参阅此处的示例。

于 2015-07-31T15:45:31.837 回答