5

これを達成する方法はありますか?

たとえば、10 個のワーカー スレッドがタスクをプルしている I/O 完了ポートがあります。各タスクはオブジェクトに関連付けられています。一部のオブジェクトは同時に処理できないため、1 つのスレッドがこれらのオブジェクトの 1 つを処理しているときに、2 番目のスレッドがこのオブジェクトを必要とするタスクを取り出した場合、2 番目のスレッドは最初のスレッドが完了するまで待機する必要があります。

回避策として、オブジェクトはリリース時に通知されるイベントを持つことができます。タスクが受信されたためにロックされたオブジェクトが必要なためにスレッドが「スタック」している場合、ロックされたオブジェクトが解放されるか、新しいタスクがキューに入れられるのを待つことができます。新しいタスクを取得すると、処理できなかったタスクをキューに戻します。

私は別のアプローチを知っていますが、これは存在すべき機能のようです。これは Windows API で実現できますか?

4

2 に答える 2

3

デザインを変更します。

内部タスク キューをオブジェクトに追加します。次に、タスクが IOCP にポストされると、IOCP スレッドがそのタスクをオブジェクトのタスク キューに配置し、他のスレッドがこのオブジェクトのタスクを「処理」していない場合は、この IOCP スレッドがオブジェクトを処理中としてマークし、タスクの処理を開始します。 ; (オブジェクト キューごとにロックし、タスクを追加し、処理スレッドであるかどうかを確認し、キューのロックを解除します)、オブジェクト内のタスクを処理するか、IOCP に戻ります。

別のスレッドが同じオブジェクトのタスクを持っている場合、それも同じプロセスを通過します。オブジェクトを処理するスレッドは、オブジェクトのタスク キューのロックを保持しないことに注意してください。そのため、新しい IOCP スレッドは、タスクをオブジェクトのキューに追加し、スレッドが既に処理中であることを確認して、単に IOCP に戻ることができます。

スレッドが現在のタスクを終了すると、オブジェクトのタスク キューを再度チェックし、次のタスクの処理を続行するか、キューが空の場合はオブジェクトを処理していないとマークして IOCP に戻ります。

これにより、まだ実行できないタスクで IOCP スレッドをブロックすることを防ぎ、その時点でたまたま処理中のスレッドに対するデータの局所性を維持します。

潜在的な問題の 1 つは、常にビジーなオブジェクトが他のオブジェクトを枯渇させる可能性があることですが、これを回避するには、処理したタスクの数を確認し、それが調整可能な最大値を超えている場合は、次に処理するタスクを IOCP に戻して他のタスクを処理するようにします。オブジェクトにはチャンスがあります。

于 2012-06-17T17:13:11.140 に答える
1

考えられる解決策は、スレッドがイベントを待機し、イベントが発生したときに完了ポートに投稿することです。または、スレッドにイベントを待機させ、それを処理するだけにします。実行する必要がある 2 つの根本的に異なることがある場合は、2 つのスレッドを使用してそれらを実行します。

于 2012-06-17T04:28:29.337 に答える