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

被折叠的 条评论
为什么被折叠?



