Я собираюсь сделать несколько предположений, потому что, как отметили более знающие люди, чем я, такое поведение немедленно поднимает вопрос , почему вам (кажется, вам) нужно уничтожить / воссоздать эти темы, и почему это так запутано, как это:
- У вас есть веская причина для удаления / воссоздания потоков
- У вас есть веская причина для добавления такого количества бесполезных слоев в процесс создания потока
- Ваш код, который будет «получать сообщение от другого пользовательского агента», имеет доступ к идентификаторам потоков
- Ваши функции
send
и recv
могут иметь доступ к какому-либо механизму пометки
Это такой подход к башмачку, что я почти боюсь приближаться к нему. Не зная больше об ограничениях вашего дизайна, трудно выразить больше, чем некоторые опции, которые вы можете начать изучать.
Во-первых, давайте настроим функции send
и recv
, чтобы они могли получать уведомления о том, что пришло время прощаться:
void* send_thread(void *arg)
{
pthread_mutex_lock(&wrapUpFlagMutex);
bool timeToQuit = wrapUpFlag;
pthread_mutex_unlock(&wrapUpFlagMutex);
while( timeToQuit == false )
{
...
// You're doing something here
...
pthread_mutex_lock(&wrapUpFlagMutex);
timeToQuit = wrapUpFlag;
pthread_mutex_unlock(&wrapUpFlagMutex);
}
// We've been flagged! Get out...the join will catch us.
pthread_exit();
}
Теперь измените код, который каким-то образом знает, когда магия должна закончиться и перезапуститься:
dontShootTheMessenger()
{
...
// We've just determined that those threads need to be restarted
// Flag those functions to wrap it up
pthread_mutex_lock(&wrapUpFlagMutex);
wrapUpFlag = true;
pthread_mutex_unlock(&wrapUpFlagMutex);
// Join the threads, note that this will block
pthread_join(thread3, NULL);
pthread_join(thread2, NULL);
pthread_join(thread1, NULL);
// Flag those functions to...not...wrap it up
pthread_mutex_lock(&wrapUpFlagMutex);
wrapUpFlag = false;
pthread_mutex_unlock(&wrapUpFlagMutex);
// Launch those puppies again
pthread_create(thread1, NULL, first_thread, NULL);
...
}
Опять же, это мимималистский подход. Более надежный метод, вероятно, будет включать условные переменные, реорганизацию вашей вызывающей структуры, фактически используя переданные аргументы функциям потока и возвращаемые значения для pthread_exit()
, и многое другое.
Также, в зависимости от ваших ограничений, вас могут заинтересовать такие функции, как pthread_kill . Обратите внимание, что какой бы дорогой вы ни шли, вы не избавляете себя от каких-либо проблем, просто надеясь, что процесс уничтожения нитей каким-то образом прояснит вам ситуацию.