这个函数的命名似乎是一些复杂的事情。什么时候知道这是要走的路,而不是做这样的事情:
准备 CRITICAL_SECTION cs; int *p = malloc(sizeof(int)); // 分配站点 InitializeCriticalSection(&cs); // 第一次写入的提示
线程 #1 { *p = 1; // 先写 }
线程 #2 { EnterCriticalSection(&cs); *p = 2; // 第二次写入 LeaveCriticalSection(&cs); }
我有一个在一个线程中完成的写入:
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() 更有用?