Я создаю неразделенный поток, который можно остановить с помощью двух разных методов. Один из них (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
Спасибо за напоминание, 'm_continue' является атомным булевым. –