2015-07-31 6 views
1

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

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

+2

Я думаю, что вы страдаете от проблемы XY. Что вы пытаетесь достичь с этим? – fuz

+0

@FUZxxl: Я хочу скрыть ожидающий поток, чтобы ОС не увидела его (это для некоторого теста планирования). Я думал, что убью его, а потом, когда я хочу его разбудить, я его восстановил. Для моего проекта очень важно скрыть поток. – zmeftah

+3

Если это действительно необходимо для вашего проекта, тогда решение этого - написать свою собственную операционную систему или, по крайней мере, библиотеку потоков. – Art

ответ

5

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

pthread_lock не может решить мою проблему, потому что мне нужно убедиться, что ОС не планирует мой поток. но я не знал о паузе. Спасибо вам за это. – zmeftah

+0

@zmeftah Зачем вам нужно, чтобы ОС не планировала нить? – Jason

+0

, потому что тогда я собираюсь использовать тестовую программу и получить некоторые результаты и сделать некоторое сравнение ... что-то вроде этого. ситуация, которую я тестирую, заключается в том, что ОС не должна планировать ее вообще. – zmeftah

1

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

+0

К сожалению, блокировка - это именно то, чего я не хочу (я не верю ей), потому что с помощью блокировок нет способа убедиться, что ОС не планирует мой поток, и мне нужно что-то доказать. – zmeftah

+1

Ну, я уверен, что с функциональными операционными системами нить, застрявшая на, скажем, семафоре, вообще не будет иметь никаких циклов процессора. –

Смежные вопросы