Как сохранить стек потока до его выхода?
Я работаю над многопоточным проектом, и мне нужно сделать копию стека потока в какой-то момент в коде (мне нужен указатель на это). потому что мне понадобится этот указатель после выхода из этого потока (и его стек освобожден). Это также сделало бы работу, если бы я мог как-то сказать 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);
Как сказали комментаторы, сохранение стека потоков для его последующего восстановления будет очень трудным. Если вам нужно предотвратить вызов потока, вы можете попытаться приостановить его с помощью блокировки. Смотрите пример здесь.