2017-01-17 6 views
1

ループを持つ接続処理スレッドを持つプログラムがあります。問題は、ループが速すぎて実行され、CPUコアが100%消費されることです。あまりにも高速なネットワークループを処理するにはどうすればいいですか?

クライアントがない場合は、最後にstd::this_thread::sleep_for(std::chrono::milliseconds(1));(またはそれに類するもの)を入れてみましたが、クライアントがいるときは問題はありますが、CPUホギングは解決しますが、新しい接続への応答にも遅延が生じます。睡眠は信頼性が低く、通常1ミリ秒を超える結果にはなりません。そして、睡眠が小さい場合は、とにかく効率的な睡眠をとることはありません(CPUコア消費量は1〜3%)。

これを処理するにはどうすればよいですか?

+0

私が正しい場合は、効果的にネットワーク経由でのサービス/アプリケーションに接続しているクライアントによってDDoSedされるのを避けるためにどのように求めていますか? –

+0

@LightnessRacesinOrbitいいえ、私は尋ねるだけで駄目です、そして、私が言及された概念に新しいという事実はそれをさらに困難にします。ちなみに、有効なクライアントが誰なのかわからないので、DDoS攻撃を避けることはできません。なぜなら、何らかの検証を行っても、それぞれの検証が同じ結果になるからです。 –

+1

まあまあ! :)あなたの問題がネットワーク活動が一定ではない場合は、I/Oアクティビティを待っていない(または、以下の回答に示されているようにポーリングしていない)だけであれば問題ありません。 –

答えて

2

アクティブな待機は、めったに良い考えではありません。通常、待ち時間をシステムに委譲し、イベントが発生するたびに目を覚ます方が良い方法です。 fdsのいずれかのファイルディスクリプタ上で発生するイベントのために

#include <poll.h> 
// ... 
::poll(&fds, nfds, timeout); 

ウェイツ(ブロック)timeoutミリ秒:

Linuxシステムで

poll()は、まさにこれを行います。関連のないツーファイル・ディスクリプタ例のための代替として


、私はpthread_cond_wait()pthread_cond_signal()を使用すると思います。ミューテックスと条件を有する者の仕事:

  • pthread_cond_wait(&cond, &mutex)mutexロックを解除し、すぐcondが満たされるまで(合図)スリープ状態にスレッドを置くが、それはミューテックスを再取得。

  • pthread_cond_signal(&cond)は、条件が変更されている可能性があるすべてのスレッドがcondを待っていることを通知します。

典型的な使い方は次のようになります。

worker thread: 
    ::pthread_mutex_lock(&mutex); 
    while (condition == false) { 
     ::pthread_cond_wait(&cond, &mutex); // passive wait 
    } 
    // this part is only invoked when: 
    // - condition is true 
    // - mutex has been acquired 
    ::pthread_mutex_unlock(&mutex); 

thread handling connection/deconnection: 
    ::pthread_mutex_lock(&mutex); 
    // add/remove clients 
    ::pthread_cond_signal(&cond); 
    ::pthread_mutex_unlock(&mutex); 

参照:

+0

これは 'select(...)'と似ています。しかし、あなたがソケットを持っていない場合やスレッドがそれらについて知ることさえしたくない場合はどうですか?私はネットワーキング(それは私が悪い質問をした可能性が高いです)を述べたので、あなたはちょうど質問に答えていることを知っていますが、もっと一般的なケースがあると思っていましたか? –

+1

@JustinBieber一般的なケースは、OS特有のもので、ブロック読み取り、セマフォーなどを使用することです。プログラムがカーネルイベントを待ってブロックされるような操作。 –

+0

@RichardCritten私は、全体的な設計が抽象化されたコードなので、ソケット記述子で直接操作することを避けようとしています。どのようにセマフォを使ってそのようなことをしますか?私は、別のスレッドがチェックを行い、ミューテックスをロック/ロックすることができると思いますが、スレッドが速すぎるかどうかをチェックする同じ問題があります。 –

関連する問題