- PR -

C++ スレッド間の排他制御について

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-24 22:27
あれれ?
引用:
コード:
// スレッド終了まで待つ
if( WaitForSingleObject( m_hEvent,INFINITE ) == WAIT_OBJECT_0 )
    OutputDebugString("WAIT_OBJECT_0\\n");
else if( WaitForSingleObject( m_hEvent,INFINITE ) == WAIT_ABANDONED )
    OutputDebugString("WAIT_ABANDONED\\n");
else if( WaitForSingleObject( m_hEvent,INFINITE ) == WAIT_TIMEOUT )
    OutputDebugString("WAIT_TIMEOUT\\n");



このコード、本当に意図通りに動きますか?

まぁ、動くにしても、
コード:
switch (WaitForSingleObject( m_hEvent,INFINITE )) {
case WAIT_OBJECT_0:
    ...
    break;
case WAIT_ABANDONED:
    ...
    break;
case WAIT_TIMEOUT:
    ...
    break;
default:
    ....
}


とかでいいのでは?
est
会議室デビュー日: 2007/08/03
投稿数: 12
投稿日時: 2008-04-25 18:53
>Jitta さま

質問した当初のコードでは、意図通りに動いてませんでした。
実行時にmain関数がループし続けて処理Aだけをひたすら実施し、
スレッド内の処理Bが遅れて実行される、ということがありました。

あと、むやみに if〜else ifを多用するよりはswitch文のほうが簡潔にかけますね。
この点は、気づいていませんでした。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-28 21:39
引用:

estさんの書き込み (2008-04-25 18:53) より:
あと、むやみに if〜else ifを多用するよりはswitch文のほうが簡潔にかけますね。
この点は、気づいていませんでした。


 ん?たぶん、こちらの意図が正しく伝わっていないかも。

 私の意図は、次のように、if を並べたものでもかまわないのですよ。
コード:
// スレッド終了まで待つ
DWORD retVal =  WaitForSingleObject( m_hEvent,INFINITE );
if(retVal == WAIT_OBJECT_0 )
    OutputDebugString("WAIT_OBJECT_0\\n");
else if( retVal) == WAIT_ABANDONED )
    OutputDebugString("WAIT_ABANDONED\\n");
else if( retVal == WAIT_TIMEOUT )
    OutputDebugString("WAIT_TIMEOUT\\n");


 最初の if 文で、m_hEvent が終了するまで待つ。このとき、戻り値が WAIT_OBJECT_0 でなければ、また WaitForSingleObject 関数を実行することになっています。このときの戻り値が気になります。最初の if で WAIT_ABANDONED だった場合、次の呼び出しも WAIT_ABANDONED になるのでしょうか。ならないのなら、意図通りに動かないですよね?
 同じようなことを、他の関数でもやっていませんか?

スキルアップ/キャリアアップ(JOB@IT)