Я делаю серийный IO на linux в C++, используя многопоточность. В настоящее время я использую блокировку чтения. Это оставляет мне никоим образом не остановить поток, который мы рассмотрим в блокировке read(), за исключением того, чтобы принудительно прекратить или прервать поток или использовать что-то вроде отмены pthread. Теперь по всей сети я вижу, как люди кричат на людей, предлагая им прекратить там потоки от блокировки IO. Обычно это касается утечек памяти. Есть ли какая-то магическая утечка памяти, которая может возникнуть из-за прерывания потока, если вы правильно очищаете?Завершение блокировки ввода-вывода в Linux C++
try
{
while(true)
{
blocking_read(fd,buffer,512);
}
}catch(interrupt_exception)
{
}
//clean up, close fd, release heap memory, usual stuff
Или это моя единственная альтернатива-то вроде ниже или реализуют протокол более высокого уровня, обеспечивающего блокировки чтения получает знак от входа позволяет ему отключился.
try
{
while(running)
{
nonblocking_read(fd,buffer,512);
if(cancel)
running = false; //break return etc
}
}
//clean up, close fd, release heap memory, usual stuff
Так опять же, там случаются некоторые магические утечки памяти для чтения(), если вы прервали нить, заставляя его бросить исключение.
Или мне просто не нужно и пусть деструктор убивает нить (я предполагаю, что поток прекращается, когда вы удаляете свой объект, удерживающий поток)? и убирать там? например
class MyClass{
int fd;
Thread* myThread;
~MyClass(){
delete myThread;
close(fd);
}
};
Благодарим за любую помощь!
Очень практичный и полезный ответ. Я видел применение этого ответа в проекте, связанном с маршрутизатором, с которым я работал. Спасибо, что дал много вариантов – achoora