curr_sequence = (UCHAR) InterlockedIncrement(&last_sequence);
refcount = InterlockedDecrement(&This->RefCount);
InitializeCriticalSection(&g_cs);
MeasureConcurrentOperation(TEXT("Critical Section"), nThreads, CriticalSectionCallback);
// Don't forget to cleanup
DeleteCriticalSection(&g_cs);
void WINAPI CriticalSectionCallback()
{
EnterCriticalSection(&g_cs);
gv_value = 0;
LeaveCriticalSection(&g_cs);
}
Slim Reader/Writer lock
// Prepare the Slim Reader/Writer lock
InitializeSRWLock(&g_srwLock);
MeasureConcurrentOperation(TEXT("SRWLock Read"), nThreads, SRWLockReadCallback);
MeasureConcurrentOperation(TEXT("SRWLock Write"), nThreads, SRWLockWriteCallback);
// NOTE: You can't cleanup a Slim Reader/Writer lock
void WINAPI SRWLockReadCallback() {
AcquireSRWLockShared(&g_srwLock);
gv_value = 0;
ReleaseSRWLockShared(&g_srwLock);
}
the mutex
// Prepare the mutex
g_hMutex = CreateMutex(NULL, false, NULL);
MeasureConcurrentOperation(TEXT("Mutex"), nThreads, MutexCallback);
CloseHandle(g_hMutex);
HANDLE g_hMutex;
void WINAPI MutexCallback()
{
WaitForSingleObject(g_hMutex, INFINITE);
gv_value = 0;
ReleaseMutex(g_hMutex);
}
有两种不同类型的事件对象。一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。
If this parameter is TRUE, the function creates a manual-reset event object, which requires the use of the ResetEvent function to set the event state to nonsignaled. If this parameter is FALSE, the function creates an auto-reset event object, and system automatically resets the event state to nonsignaled after a single waiting thread has been released.