2011-12-18 6 views
14

が、私はそれがどのように動作するか、はAPC が何であるかを理解して、と私は(プログラマーとして)の代わりに、QueueUserAPCを使用する必要があるときのWindowsがそれをどのように使用するかが、私は理解していない、と言う、繊維、スレッドプールスレッド。QueueUserAPC()をいつ使用しますか?

私はQueueUserAPCを使用することを選択し、なぜでしょうか?

+1

これは、Windowsメッセージループの低レベルの機能です。スレッドに安全な方法でコードを注入することができます。スレッドは、アラート可能な待機を実行することによって、再入可能を処理する準備ができていることを通知します。 GetMessage()の呼び出しと同じです。 –

+0

@ HansPassant:うーん...そうだと思うけど、GetMessage()のようにはどういうものか分かりません。 GetMessageは単純にメッセージを取得しますが、QueueUserAPC *はメソッドを呼び出すため、スタックオーバーフローが発生する可能性があります。彼らは異なっているようです... – Mehrdad

+0

"GetMessage"は警戒待ちではないということを誰もが覚えておきたいです。そして@Mehrdad、QueueUserAPCは、スレッドがそれらを処理する準備ができるまで、メソッドを呼び出すことはありません。 – Lothar

答えて

15

QueueUserAPCは、多くの場合、そうでない場合は、同期オブジェクトで処理されるいくつかのタスクのショートカットすることができきちんとしたツールです。特定のスレッドに、そのスレッドにとって都合が良いとき(つまり、現在の作業が終了して何かを待っているときなど)何かをするように指示することができます。

のは、あなたがメインスレッドとワーカースレッドがあるとしましょう。ワーカースレッドは、ファイルサーバーへのソケットを開き、recv()をループで呼び出すことによって10GBファイルのダウンロードを開始します。メインスレッドは、ネットパケットを待っている間、ワーカースレッドがダウンタイムで何か他のことをしたいと思っています。作業者が待機していて何もしない間に実行される関数を待ち行列に入れることができます。

シナリオのように、私はあなたが(未定義の動作につながる)、別のブロックのWinSock呼び出しを行うしたいとは思わないでしょう言及したので、あなたは、APCを持つ注意する必要があります。同じことを他の方法で行うことができるので、この機能を有効に活用するには、実際に監視する必要があります。たとえば、待機中に実行する機能を与えるのではなく、スリープ状態になるたびに別のスレッドがイベントをチェックするようにします。明らかに、このシナリオでは、APCがより簡単になります。

それはあなたがコールデスクの従業員が座って電話を待っていたときのようなもので、あなたはその人に彼らのダウンタイム中に行うにはほとんどのタスクを与えます。 "ここで、あなたが待っている間にこのルービックのキューブを解く。"しかし、電話がかかっても、Rubikのキューブを電話に出すことはありませんでした(APCはスレッドが待機する前に戻る必要があります)。

QueueUserAPCは、あるデータ構造を担当する単一のスレッド(スレッドA)があり、別のスレッド(スレッドB)のデータ構造に対して何らかの操作を実行したい場合にも便利ですが、同期のオーバーヘッドを必要とするか、2つのスレッド間でそのデータを共有しようとすると複雑になります。スレッドBがその構造を単独で維持するスレッドA上で動作するようにキューすることにより、同期を心配することなく、そのデータに必要な任意の関数を実行します。

これは、スレッドプールのような単なる別のツールです。ただし、スレッドプールでは、特定のスレッドにタスクを送信することはできません。あなたは仕事がどこで行われているかを制御できません。タスクをキューに入れると、新しいスレッドがまったく作成されなくなる可能性があります。 2つのタスクをキューに入れることができ、それらは2つの異なるスレッドで同時に完了します。 QueueUserAPCを使用すると、タスクが順番に、および指定したスレッドで完了することが保証されます。

関連する問題