C++ では、「recvfrom」関数はブロッキング関数です (パケットが到着するまでスレッドをブロックします)。
「recvfrom」でブロックされたスレッドを安全に終了するにはどうすればよいですか?
C++ では、「recvfrom」関数はブロッキング関数です (パケットが到着するまでスレッドをブロックします)。
「recvfrom」でブロックされたスレッドを安全に終了するにはどうすればよいですか?
recvfrom
select / poll / epollが正常に戻った後でのみ呼び出すことにより、この状況を回避します。
コメントで言及されている@RemyLebeauのように、以下のようなものをプルアップできます。
while(run_flag) {
if(check select/poll/epoll) {
recvfrom(..)
}
}
ここでepollとselectを開始できます。インターネットにもたくさんあります。
別のアプローチは、スレッド化の代わりに非同期ネットワーク操作を使用することです。
また、 boost :: asioを使用することをお勧めします。これにより、ネットワーク関連のものがすべて単純になります。
「セルフパイプ」トリックを使用します。
pipe(2) システム コールを使用してパイプを開きます。select/poll/kqueue/whatever を使用してループに座って、関心のあるソケットとパイプから読み取ります。ソケットからデータを取得したら、通常どおりに処理します。
スレッドを停止するには、処理を停止したいスレッドのパイプのもう一方の端を閉じます。これをパイプ上の EOF として検出し、これをシグナルとして使用して、スレッドが実際のソケットを処理するのを停止できます。