特征 |
互斥量 |
关键段 |
---|---|---|
性能 |
慢 |
块 |
是否能跨进程使用 |
是 |
否 |
声明 |
HANDLE hmtx; |
CRITICAL_SECTION cs; |
初始化 |
hmtx = CreateMutex (NULL, FALSE, NULL); |
InitializeCriticalSection(&cs); |
清理 |
CloseHandle(hmtx); |
DeleteCriticalSection(&cs); |
无限等待 |
WaitForSingleObject (hmtx, INFINITE); |
EnterCriticalSection(&cs); |
0等待 |
WaitForSingleObject (hmtx, 0); |
TryEnterCriticalSection(&cs); |
任意时间长度的等待 |
WaitForSingleObject (hmtx, dwMilliseconds); |
不支持 |
释放 |
ReleaseMutex(hmtx); |
LeaveCriticalSection(&cs); |
是否能同时等待其它 内核对象 |
是 (使用WaitForMultipleObjects 或类似函数) |
否 |
表1:互斥量和关键段比较
对象 |
何时处于未触发状态 |
何时处于触发状态 |
成功等待的副作用 |
进程 |
当进程仍在运行的时候 |
当进程终止运行时(ExitProcess, Te rminateProcess) |
无 |
线程 |
当线程仍在运行时 |
当线程终止运行时(ExitThread, TerminateThread) |
无 |
作业 |
当作业尚未超时的时候 |
当作业超时的时候 |
无 |
文件 |
当I / O请求正在处理时 |
当I / O请求处理完毕时 |
无 |
控制台输入 |
不存在任何输入 |
当存在输入时 |
无 |
文件修改通知 |
没有任何文件被修改 |
当文件系统发现修改时 |
重置通知 |
自动重置事件 |
ResetEvent , PulseEvent或等待成功 |
当调用SetEvent / PulseEvent时 |
重置事件 |
手动重置事件 |
ResetEvent或PulseEvent |
当调用SetEvent / PulseEvent时 |
无 |
自动重置等待计时器 |
CancelWaitableTimer或等待成功 |
当时间到时(SetWaitableTimer) |
重置定时器 |
手动重置等待计时器 |
CancelWaitableTimer |
当时间到时(SetWaitableTimer) |
无 |
信号量 |
等待成功 |
当数量> 0时(ReleaseSemaphore) |
数量递减1 |
互斥对象 |
等待成功 |
当未被线程拥有时(Release互斥对象) |
将所有权赋予线程 |
关键代码段(用户模式) |
等待成功((Try)EnterCriticalSection) |
当未被线程拥有时(LeaveCriticalSection) |
将所有权赋予线程 |
SRWLock (用户模式) | 等待成功的时候 (AcquireSRWLock(Exclusive)) | 不为线程占用的时候 (ReleaseSRWLock(Exclusive)) | 把所有权交给线程 |
条件变量 (用户模式) | 等待成功地时候 (SleepConditionVariable*) | 被唤醒的时候 (Wake(All)ConditionVariable) | 没有 |