首页 > 代码库 > 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时触发
    递归计数;//该线程占用互斥量的次数
}