質問: 複数のスレッドを立てプログラム動作させています この際、WaitForMultipleObjectsで指定されたカーネルオブジェクトのうちの1つまたはそれらのすべてがシグナル状態になるか、指定された時間が経過するまで待機しています。 但し、この方式の場合64個までのハンドル待機しか出来ません。 ここで 1.64個以上のハンドル待機を実現する方式 以下の記載は、見ましたが詳細が不明なので出しています 2.この方式以外でのハンドル制御方式 出来うる限り具体的に! これ等の何れかを教えて下さい
回答: 1について > > •64 (MAXIMUM_WAIT_OBJECTS) 個のハンドルを待機するスレッドを作成し、そのスレッドとそれ以外の待機オブジェクトのハンドルを待機します。この方法を使用して、ハンドルを64 (MAXIMUM_WAIT_OBJECTS) 個ずつのグループに分割します。 > > > N個のカーネルオブジェクトを監視するために、最大64個ずつのM(<64)グループに分けます。 各グループごとにスレッドを起動し、そのスレッドで自分のグループに属するカーネルオブジェクトに対して、WaitForMultipleObjectsを呼び出してやり、1つまたはそれらのすべてがシグナル状態になった時点でそのスレッドを抜けるようにします。 こうすると、M個のスレッドオブジェクトに対して、WaitForMultipleObjectを呼び出すと、最終的にはN個に対してWaitForMultipleObjectを呼び出しているような処理が実現できるということだと思います。 Mが64以上になる、つまり、Nが64x64以上になるのであれば、この仕組みをもう一段増やせば、64x64x64まで対応できます。 > > •RegisterWaitForSingleObjectを呼び出してそれぞれのハンドルを待機します。スレッドプール由来の待機スレッドが64 (MAXIMUM_WAIT_OBJECTS) 個の登録オブジェクトを待機し、オブジェクトがシグナル化されるかタイムアウト時間が経過した後に作業スレッドを割り当てます。 > > > N個のカーネルオブジェクトごとに、RegisterWaitForSingleObjectを呼び出して、コールバックを指定します。 各カーネルオブジェクトにIDをつけて、コールバックにそのIDが渡るようにしてあげれば、コールバックの方ですべてのオブジェクトに対してのシグナルを監視できます。 このシグナルを監視して、1つまたはそれらのすべてがシグナル状態になった時点でイベントを発生させるようにして、そのイベントが発生するまで待機するような仕組みで対応するということだと思います。 2について どんなカーネルオブジェクトを監視し、どのような条件で処理を行いたいかではないでしょうか? すべてのカーネルオブジェクトがシグナル状態になるまで待つのであれば、64個ずつWaitForMultipleObjectを呼び出す処理をループしてあげればいいでしょう。 対象がスレッドだとして、スレッドのルーチンを多少変更できるのであれば、どれか1つでもシグナル状態になったことがわかるだけでいいのであれば、排他制御しないで共有するフラグを用意してあげるだけでも十分な気がします。