この関数のネーミングは、複雑なことが起こっているようです。次のようなことをする代わりに、これが進むべき道であることを正確に知るのはいつですか:
準備 CRITICAL_SECTION cs; int *p = malloc(sizeof(int)); // 割り当てサイト InitializeCriticalSection(&cs); // 最初の書き込みのヒント
スレッド #1 { *p = 1; // 最初の書き込み }
スレッド #2 { EnterCriticalSection(&cs); *p = 2; // 2 回目の書き込み LeaveCriticalSection(&cs); }
1 つのスレッドで実行される書き込みがあります。
Run()
{
// some code
m_bIsTerminated = TRUE;
// some more code
}
次に、別のスレッドで行われる読み取りがあります (同時に行われる可能性があります)。
Terminate()
{
// some code
if( m_bIsTerminated )
{
m_dwThreadId = 0;
m_hThread = NULL;
m_evExit.SetEvent();
return;
}
// even more code
}
この競合状態を解決するための最良の解決策は何ですか? クリティカル セクションを使用するか、InterlockedExchangeAdd() を使用する方が便利ですか?