2017-06-16 11 views
0

私はそれが私の質問を語る最良の方法ではないことを知っています。私のサーバーでは、いくつかの問題が基本的にこれにまで及んでいます - conditionAが満たされたらwhileループからどのように壊れますか? conditionBが満たされていれば、特定のスレッドを破棄することは可能ですか?アクティブなスレッドでwhileループを中断する方法

残念ながら、ループから壊れることができない限り、メインスレッドはrecvfrom()関数によって永遠にブロックされます。

while (1) 
{ 
    recBytes = recvfrom(sock, packetBuff, 8, 0, (struct sockaddr *) &client, &SockLength); 

    std::thread TX([&] 
    { 
    //process packet task 

    if(conditionA == 1) 
     break from while loop 

    if(conditionB == 1) 
     destroy any active threads spawned by TX 

    . 
    . 
    . 
    much more tasks 

    }); 

    TX.detach(); 
} 

. 
. 
. 
continue rest of code 

ありがとうございます!

+1

いくつかのasioライブラリの使用を検討しましたか? boost.asioが気になりますが、他のライブラリも利用できます。すでに述べたように、別のスレッドからソケットを閉じることは、recv_fromを終了し、エラーの場合をチェックするのに十分簡単で効果的です。 breakステートメントはループを終了します。 –

+0

私はYTでこの講演をお勧めしますか?「時間の歴史:非同期C++ - Steven Simpson」?最新のC++技術を使用してクライアント/サーバーアプリケーションを設計する前に、時間を割く価値があります。あなたが望むサイズのアプリなら何でも。 –

+0

@MichaëlRoyこれはどうかのように見えるコードで私を見せてもらえますか? – djent

答えて

1

ブロッキングI/Oコールを中断する標準的な方法は、データソケットとノンブロッキング通知パイプの2つのソケットを待機するselect()/ poll()/ etcに置き換えます。 select()があなたのデータソケットを読み書きすることができると報告するならば、非ブロック的な方法でそれを行うだけです。通知パイプでデータが利用可能であると報告された場合は、ループを解除します。どのスレッドも、非ブロッキング通知パイプに1バイトを書き込んで、別のスレッドのselect()を返すことができます。

他のスレッドを破壊するには、それらのスレッドからの協力なしには実行できません。基本的に、終了する必要があることを通知する方法が必要です。それらのスレッドが呼び出しをブロックしない場合、定期的なチェックを伴う簡単なアトミックフラグが行います。それ以外の場合は、ブロッキングコールから切断する方法が必要です。それがI/Oコールの場合は、別の通知パイプを導入してください。条件変数でブロックしている場合は、std :: condition_variable :: notify_all()を使用します。

+0

boost.asioコードサンプルを確認してください:http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/example/cpp11/echo/async_udp_echo_server.cpp –

+0

@Tulonこれは何のように見えますか?私は第三者図書館を使うことはできません – djent

+0

@djentそれは原則としてどのように行われたのか説明しましたが、実装はあなた次第です。 –

関連する問題