web-dev-qa-db-ja.com

スリープを使用する代わりに実行を継続するようにループに信号を送る方法

座ってvector(キュー)内の新しいオブジェクトを検出するのを待つスレッドを作成しようとしています。ループを使用すると、指定されたマシンのリソースが破壊されるため、メインスレッドからの通知を待機するブロッキングスレッドを作成する方法を理解しようとしています。

アプリケーションは基本的にvector内の新しいオブジェクトを待ち、重いIO操作-大きなファイルの読み取り、それらの圧縮、ディスクへの書き込みを行います。

4
user0000001

(私はあなたが何を望んでいるか理解していない;私は推測しようとしている;非同期IOは aio(7) を意味するかもしれないが、それからあなたは話さないだろうそれらを行うためのスレッドですが、私はあなたがLinuxを使っていると思います-私の答えを他のOSに適応させてください)

条件変数 の使用を検討する場合があります std :: condition_variablestd :: mutex とともに使用する(おそらく他のスレッドが条件変数に信号を送る場合など)キューに追加します)。概念に慣れていない場合は、 このpthreadチュートリアル を参照してください(次に、アイデアをC++ 11 threads に適合させます)。

LinuxなどのPOSIXシステムでは、一部の イベントループpoll(2) などを使用して、一連のファイル記述子が読み取り可能または書き込み可能であることを確認できます。参照 this ;また、慎重にSIGIOを使用できます( signal(7) および signal-safetyを参照) (7) first ...;async-signal-safe functionsはシグナルハンドラーからのみ呼び出すことができることに注意してください-ほとんどのC++を除外しますまたはC標準ライブラリ;実際には、いくつかのvolatile sigatomic_tフラグをその中に入れ、これらのフラグを他の場所でテストします。イベントループで)。また、プログラムの初期化時に pipe(7) を自己に設定し、 write(2) をシグナルハンドラから設定することもできます(BTW、このトリックは nixシグナルハンドラーからのQt関数の呼び出し )、またはミューテックスされたクリティカルセクション内のQt。

PS。 NIXシグナル条件変数のシグナリングまたはブロードキャスト を混同しないでください(これは、Unix signal(7) ハンドラー内から確実に行うことはできません)。