2016-10-17 11 views
0

Я создаю неразделенный поток, который можно остановить с помощью двух разных методов. Один из них (stop()) предоставляет интерфейс синхронизации, присоединяясь к порожденному потоку, в то время как другой (stopAsync()) просто устанавливает переменную управления m_continue в false и не дожидается завершения указанного потока.Обязательно ли присоединиться к отдельной теме?

void run() 
{ 
    while(m_continue) 
    { 
     // Do something 
    } 
} 

void start() 
{ 
    m_continue = true; 
    // Spawn a new thread for run() 
} 

void stop() 
{ 
    m_continue = false; 
    // Join to the spawned thread 
} 

void stopAsync() 
{ 
    m_continue = false; 
} 

В случае stopAsync() называется, в то время как цикл в run() метод отделки, но никто не присоединяется к этому потоку. Есть ли утечка ресурсов для этого случая? Обязательно ли присоединиться к неразделенной теме?

Я не мог понять из документации. Часть «Примечания» говорит кое-что, что я не могу понять.

Нить может быть соединена или отсоединена. Если поток соединяется, то другой поток может вызвать pthread_join (3), чтобы дождаться завершения потока и получить его статус выхода. Только когда объединенная нить соединяется, это последний из ее ресурсов, выпущенных обратно в систему. Когда отдельная нить завершается, ее ресурсы автоматически возвращаются обратно в систему: невозможно присоединиться к потоку, чтобы получить его статус выхода. Создание отсоединенного потока полезно для некоторых типов потоков демона, состояние выхода которых не нужно заботиться о приложении. По умолчанию новый поток создается в состоянии соединения, если attr не был настроен для создания потока в отдельном состоянии (используя pthread_attr_setdetachstate (3)).

https://linux.die.net/man/3/pthread_create

ответ

0

Только когда завершившаяся объединяемая нить присоединились последний из своих ресурсов выпустили обратно в систему.

Последствием этой части документации является то, что некоторые ресурсы для потока останутся выделенными после того, как она выйдет, если вы не присоединитесь к ней. Таким образом, это аналогично вызову malloc() без free() - это не «обязательно» в том смысле, что это не вызовет проблемы для вашей программы, если вы этого не сделаете, но это делает представляет собой утечку ресурсов, поэтому, если вы это сделаете это повторяется в долгосрочной программе, вы можете исчерпать соответствующий ресурс.

Вместо присоединения к потоку ваш stopAsync() может только позвонить pthread_detach() в другой теме перед установкой переменной флага.

Обратите внимание, что переменная m_continue должна быть защищена примитивом синхронизации, как блокировка мьютекса или считывателя.

+0

Спасибо за напоминание, 'm_continue' является атомным булевым. –

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

  • Нет связанных вопросов^_^