0

C++ では、「recvfrom」関数はブロッキング関数です (パケットが到着するまでスレッドをブロックします)。

「recvfrom」でブロックされたスレッドを安全に終了するにはどうすればよいですか?

4

2 に答える 2

2

recvfromselect / poll / epollが正常に戻った後でのみ呼び出すことにより、この状況を回避します。

コメントで言及されている@RemyLebeauのように、以下のようなものをプルアップできます。

while(run_flag) {
    if(check select/poll/epoll) {
         recvfrom(..)
    }
}

ここでepollselectを開始できます。インターネットにもたくさんあります。

別のアプローチは、スレッド化の代わりに非同期ネットワーク操作を使用することです。

また、 boost :: asioを使用することをお勧めします。これにより、ネットワーク関連のものがすべて単純になります。

于 2013-03-04T19:38:05.127 に答える
2

「セルフパイプ」トリックを使用します。

pipe(2) システム コールを使用してパイプを開きます。select/poll/kqueue/whatever を使用してループに座って、関心のあるソケットとパイプから読み取ります。ソケットからデータを取得したら、通常どおりに処理します。

スレッドを停止するには、処理を停止したいスレッドのパイプのもう一方の端を閉じます。これをパイプ上の EOF として検出し、これをシグナルとして使用して、スレッドが実際のソケットを処理するのを停止できます。

于 2013-03-04T22:22:51.707 に答える