Как сохранить стек потока до его выхода?

Я работаю над многопоточным проектом, и мне нужно сделать копию стека потока в какой-то момент в коде (мне нужен указатель на это). потому что мне понадобится этот указатель после выхода из этого потока (и его стек освобожден). Это также сделало бы работу, если бы я мог как-то сказать pthread_exit() не освобождать стопку ниток!

PS: причина этого в том, что я хочу использовать setcontext(ucontext_t*) позже, когда этот поток фактически мертв.

2 ответа

Решение

Как уже упоминалось, это может быть проблемой 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);

Как сказали комментаторы, сохранение стека потоков для его последующего восстановления будет очень трудным. Если вам нужно предотвратить вызов потока, вы можете попытаться приостановить его с помощью блокировки. Смотрите пример здесь.

Другие вопросы по тегам