Как уничтожить объект потока

Я пишу многопоточный чат-сервер на C ++.

Когда присоединяется новый клиент, основной поток создает новый поток для управления клиентом.

Я хочу уничтожить поток, когда клиент отключается, поэтому я правильно настроил эту функцию, чтобы, когда клиент отправляет сообщение о выходе, вызывается Terminate ().

Но Terminate () вместо того, чтобы уничтожить только один поток, уничтожил все потоки.

Что нужно сделать, чтобы уничтожить только ту ветку, которую я хочу уничтожить?


person Vedant    schedule 19.10.2017    source источник
comment
Хм. Обычно поток заканчивается, когда он возвращается из своей основной функции.   -  person Scheff's Cat    schedule 19.10.2017
comment
вы уверены, что это именно тот дизайн, который вам нужен? это рецепт для проблем с масштабируемостью позже   -  person David Haim    schedule 19.10.2017
comment
@David Hamim Я делаю этот проект для 12 класса по информатике. Так что масштабируемость и эффективность меня не беспокоят, поскольку то, что я делаю, очень продвинуто для моего уровня (программа - это основы C ++, классы, обработка данных, стеки и очереди связанных списков.   -  person Vedant    schedule 19.10.2017


Ответы (1)


Вам не нужно делать ничего особенного.

std::thread получает вызываемый объект в качестве параметра в своем конструкторе, и этот вызываемый объект - это функция, которую выполняет поток.

Если этот вызываемый объект заканчивается в какой-то момент, отсоединенный поток может очистить себя. просто убедитесь, что

  • выход из функции обработки клиента при отключении клиента
  • отсоединить нить

Упрощенный дизайн может быть похож на этот:

while(server.is_on()){
   auto client = server.acccept_client();
   std::thread thread([client = std::move(client)]{
     handle_client_until_disconnection(client);
   });
   thread.detach();
}

другой подход - использовать пул потоков. этот пул потоков создается при запуске приложения и уничтожается при выходе из приложения.

person David Haim    schedule 19.10.2017
comment
Спасибо @David Hamim - person Vedant; 19.10.2017