複数のスレッドを立てプログラム動作させています

この際、WaitForMultipleObjectsで指定されたカーネルオブジェクトのうちの1つまたはそれらのすべてがシグナル状態になるか、指定された時間が経過するまで待機しています。

但し、この方式の場合64個までのハンドル待機しか出来ません。

ここで
1.64個以上のハンドル待機を実現する方式
 以下の記載は、見ましたが詳細が不明なので出しています
  http://yokohama.cool.ne.jp/chokuto/advanced/function/WaitForMultipleObjects.html

2.この方式以外でのハンドル制御方式
 出来うる限り具体的に!

これ等の何れかを教えて下さい

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/07/30 18:09:33
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tdoi No.1

回答回数174ベストアンサー獲得回数75

ポイント70pt

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つでもシグナル状態になったことがわかるだけでいいのであれば、排他制御しないで共有するフラグを用意してあげるだけでも十分な気がします。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません