アクティブな待機は、めったに良い考えではありません。通常、待ち時間をシステムに委譲し、イベントが発生するたびに目を覚ます方が良い方法です。 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);
参照:
出典
2017-01-17 10:37:56
YSC
私が正しい場合は、効果的にネットワーク経由でのサービス/アプリケーションに接続しているクライアントによってDDoSedされるのを避けるためにどのように求めていますか? –
@LightnessRacesinOrbitいいえ、私は尋ねるだけで駄目です、そして、私が言及された概念に新しいという事実はそれをさらに困難にします。ちなみに、有効なクライアントが誰なのかわからないので、DDoS攻撃を避けることはできません。なぜなら、何らかの検証を行っても、それぞれの検証が同じ結果になるからです。 –
まあまあ! :)あなたの問題がネットワーク活動が一定ではない場合は、I/Oアクティビティを待っていない(または、以下の回答に示されているようにポーリングしていない)だけであれば問題ありません。 –