2

スレッド 1

... SetEvent(_event);

EnterCriticalSection(crit);

ResetEvent(_event);

LeaveCriticalSection(crit);

スレッド 2:

EnterCriticalSection(crit);

WaitForSingleObject(_event, forever);

LeaveCriticalSection(crit);

スレッド 1 がイベントを設定すると、スレッド 2 は引き続き待機し、永遠に待機します。したがって、Thead 1 はロックを取得しようとしますが、デッドロックに失敗します。OK である SetEvent の戻り値を確認します。

スレッド 1 の EnterCriticalSection と LeaveCriticalSection を削除しましたが、SetEvent を何度も呼び出した後でもイベントが設定されていないことがわかりました。

4

1 に答える 1

5

イベントをクリティカルセクションでラップする理由はありません。イベントはそれ自体で適切なスレッド同期を提供するため、クリティカルセクションを完全に削除します。

スレッド1

SetEvent(_event); // Or PulseEvent(), depending on the nature of the event

スレッド2:

WaitForSingleObject(_event, forever);

必要なのはそれだけです。

于 2013-03-18T08:29:54.920 に答える