特征 | 互斥量 | 关键段 |
---|---|---|
性能 | 慢 | 块 |
是否能跨进程使用 | 是 | 否 |
声明 | 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) | 没有 |