0

ListenerThreadリモートサーバーによってブロードキャストされた情報をリッスンするソケットを持つ別のスレッドがあります。これは、開発する必要がある 1 つのクラスのコンストラクターで作成されます。

要件により、別のスレッドが開始されたら、メイン スレッドでのブロック機能を回避する必要があります。クラスのデストラクタを呼び出す段階になると、リスナー スレッドで結合を実行できないため、できることはそれを KILL することだけです。

私の質問は次のとおりです。

  1. スレッドに渡された関数によって割り当てられたネットワークリソースはどうなりますか? ソケットが適切に閉じられているか、保留中の何かがある可能性がありますか? (ここが一番心配)

  2. この手順は十分に高速ですか?つまり、すぐに中断するようにスレッドが強制終了されますか?

  3. 私は Linux を使用しています ...保留中のネットワーク リソースがないこと、またはオペレーティング システムで問題が発生していないことを確認するために、どのコマンドまたは何を確認できますか

あなたの助けに感謝します

よろしく MNSTN

注: C++ で boost::thread を使用しています

4

2 に答える 2

2
  1. ネットワーク リソースはスレッドではなくプロセスに属しているため、ソケットは開いたままです。

  2. boost::threadメソッドはありません kill。中断することしかできません。効果は即時ではなく、OS スケジューラーに依存します。

  3. プロセスが保持しているネットワークリソースを確認するには、チェックアウトしてくださいlsofnetstat(8)-pオプション で。

あなたが説明したようにソケットをブロックすることによる停止シグナルの問題は、通常、セルフパイプトリックで解決されます。

于 2010-04-13T14:34:40.843 に答える
2

スレッドを強制終了している場合、スレッドが保持しているリソースを確認できません。たとえば、ヒープミューテックスを保持している可能性があります。スレッドを強制終了すると、ミューテックスはロックされたままになり、(プロセス内の) 誰も動的メモリを割り当てることができなくなります。

これらのことは、力ずくで行うよりも、平和的なコンセンサスによって行う方がはるかに優れています。もう必要ないことをスレッドに知らせる方法を追加するだけです。それはすることができますboost::condition。スレッドはこの状態をチェックし、シグナルが送信されると停止します。

于 2010-04-13T14:40:51.597 に答える