• 締切済み

マルチスレッドの実行順序の制御

お世話になります。 現在作っているプログラムで別スレッドを走らせて処理をしているのですが、問題に突き当たりお知恵を借りたく質問しました。 グローバル変数があり、イベントが発生するとイベントハンドラ内で別スレッドを作成し、そのグローバル変数にイベント発生時間を追記していきたいのです。下のようにクリティカルセッションを用いて多重書き込みは禁止しています。 string g_Value; EventProc(){ createThread(,,,Thread_Proc.....); } Thread_Proc(){ EnterCriticalSection(&m_cs); g_Value += Now(); LeaveCriticalSection(&m_cs); } しかし、1つのスレッドが終了しないうちに2,3個追加でスレッドが立ち上げられた場合、それらは発生順に実行されないようです。 なにか順番を管理するいい方法はないでしょうか?

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

>発生順に実行されないようです。 これは当然の話です。CreateThreadの実行順と、実際に 制御が渡る順番は一致しません。どうしても一致さたい というなら、イベントハンドラはスレッドが処理を開始 したことを認識するまで待機しなければなりません。 EventProc(){  HANDLE 開始イベント = createEvent(…);//★1  HANDLE スレッド = createThread(,,,Thread_Proc,&開始イベント,…);  closeHandle(スレッド);//★2  waitForSingleObject(開始イベント,…);//★3  closeHandle(開始イベント);//★4 } Thread_Proc(HANDLE *開始イベント){ EnterCriticalSection(&m_cs); g_Value += Now(); setEvent(*開始イベント);//★5 LeaveCriticalSection(&m_cs); } 1.サブスレッドが実行されたことを通知するイベントを作る。  これはスレッド起動時にパラメータで渡す。 2.スレッドハンドルは不要なら閉じる。 3.サブスレッドが処理を始めるまで待機する。 4.不要になったイベントを閉じる。 5.サブスレッドが処理したことをメインスレッドに知らせる。  この操作で、★3の待機が解除される。

回答No.3

condition_variable int order = -1 を用意しておき、 n番目のスレッドは   order==n となるまで wait する。   ++order し、notify する。 んでもってmainは   スレッド0, スレッド1.... をcreateし、   order = 0 し、notifyする。

参考URL:
http://codezine.jp/article/detail/6639?p=3
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.2

システムイベントのロックしか無いでしょう。 スレッドが立ち上がったら最初にロックし、そのスレッドが終る時にアンロックしたら、次のスレッドはアンロックされるまで待たされるので、各スレッドが1つずつ実行される、という塩梅です。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

その考えに無理があるというか、スレッドの並列性を殺すので意味はあるのでしょうか? 同時実行することに意味があるのでは? → タイミングはディスパッチの運任せ。

関連するQ&A

専門家に質問してみよう