マルチスレッドを使用して、C++ の Linux でシリアル IO を実行しています。現在、ブロッキング読み取りを使用しています。そのため、強制的にスレッドを終了または中断するか、pthread キャンセルのようなものを使用する以外に、ブロックしている read() でスレッドの咳を止める方法はありません。現在、ネット全体で、ブロッキングIOからスレッドを終了する必要があると人々が叫んでいるのを目にします。通常、メモリリークが関係しています。適切にクリーンアップする限り、スレッドの中断から発生する可能性のある魔法のメモリリークはありますか?
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
繰り返しになりますが、スレッドを中断して例外をスローすると、 read() で魔法のメモリリークが発生しますか。
または、単に気にせず、デストラクタにスレッドを強制終了させる必要があります(スレッドを保持しているオブジェクトを削除すると、スレッドが終了すると仮定します)? そこを片付けますか?お気に入り
class MyClass{
int fd;
Thread* myThread;
~MyClass(){
delete myThread;
close(fd);
}
};
助けてくれてありがとう!