首页 > 代码库 > C++技术问题总结-第3篇 线程同步
C++技术问题总结-第3篇 线程同步
线程同步的方法
线程同步有多种方法。
用户模式下的线程同步:关键段(critcal section)。
内核模式下的线程同步:事件、计时器、信号量、互斥量。
1.关键段
用户模式下的同步,主要API如下。
InitializeCriticalSection、DeleteCriticalSection、EnterCriticalSection、LeaveCriticalSection。
2.事件
常用于:一个线程初始化工作,然后再触发另一个线程让它工作。主要API如下。
CreateEvent、SetEvent(设为触发)、ResetEvent(设为未触发)。
事件分为两种。
手动重置事件:正在等待该事件的所有线程变成可调度。
自动重置事件:只有一个等待线程可调度。
数据结构伪码描述
{
使用计数;
布尔值;//标识是手动还是自动重置
布尔值;//是否触发
}
3.计时器
可等待计时器,它们会在某个指定时间触发,或每隔一段时间触发一次。主要API如下。
CreateWaitableTimer、OpenWaitableTimer、SetWaitableTimer。
4.信号量
信号量内核对象用来对资源进行计数。主要API如下。
CreateSemaphore、OpenSemaphore、ReleaseSemaphore。
数据结构伪码描述
{
使用计数;
最大资源计数;
当前资源计数;//大于0时触发
}
5.互斥量
互斥量内核对象用来确保一个线程独占对一个资源的访问。主要API如下。
CreateMutex、OpenMutex、ReleaseMutex。
数据结构伪码描述
{
使用计数;
线程ID;//为0时触发
递归计数;//该线程占用互斥量的次数
}