アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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の待機が解除される。
    • good
    • 0

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
    • good
    • 0

システムイベントのロックしか無いでしょう。


スレッドが立ち上がったら最初にロックし、そのスレッドが終る時にアンロックしたら、次のスレッドはアンロックされるまで待たされるので、各スレッドが1つずつ実行される、という塩梅です。
    • good
    • 0

その考えに無理があるというか、スレッドの並列性を殺すので意味はあるのでしょうか?


同時実行することに意味があるのでは? → タイミングはディスパッチの運任せ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!