线程同步对象速查表

  

特征

互斥量

关键段

性能

是否能跨进程使用

声明

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)
没有

你可能感兴趣的:(线程同步对象速查表)