同步对象及常用API
1、 事件
事件(Event)是一个同步对象,它有两种状态:有信号状态和无信号状态。线程只有在事件有信号的时候才能获取事件,并设置事件为无信号状态,使得其他线程不能访问事件所保护的数据或代码段。线程使用完后应该将事件设置为有信号状态,以使其他线程能够使用。
API:
SetEvent:设置事件状态为有信号状态。
CreateEvent:创建一个事件对象。
ResetEvent:重设事件对象状态为无信号状态。
OpenEvent:通过返回一个已存在事件对象的句柄,使得多个进程使用同一个事件对象。
PulseEvent:设置指定的事件对象为有信号的,然后重设为无信号的。它用于释放等待线程。
WaitForSingleObject:等待一个事件。
2、 互斥量
互斥量(mutex)与临界区非常相似,只是互斥量可在进程间使用。互斥量通过强制每个线程拥有互斥量对象使线程轮流使用资源,每次只有一个线程拥有互斥量对象。
API:
ReleaseMutex:释放特定互斥量对象的所有权,在拥有权线程完成使用该互斥量控制的资源时使用该API。
CreateMutex:创建一个互斥量对象。
OpenMutex:通过返回一个已创建的互斥量对象的句柄在多个进程间同步。
3、 信号灯
信号量(Semaphores)被一定数量的线程用于控制对资源的访问(与临界区相反,临界区只允许一个线程访问资源或代码段)。信号量有个资源计数器(resource counter)。每个要访问信号量控制的资源的线程等待信号量,并将资源计数器减1。若计数器为0,则没有资源了,并且将来要访问资源的请求要等待。当一个线程使用完资源后,它释放信号量,即将资源计数器加1。
API:
CreateSemaphore:创建一个信号量,并设置其资源计数器。
ReleaseSemaphore:释放一个信号量,并将其资源计数器加1.
WaitForSingleObject:等待一个信号量(或者任何对象)。
CloseHandle:关闭句柄,并释放资源。
4、 定时器
它等待某一特定时刻的到来,并通知等待线程。
5、 临界区
它每次只允许一个线程访问资源,如公共数据或一段代码。与其他同步对象如互斥量相比,临界区相对较快。
API:
InitalizeCriticalSection: 在使用下面API之前初始化临界区对象。
EnterCriticalSection: 它使调用线程等待临界区对象,并在获得拥有权时返回。
TryEnterCriticalSection: 与EnterCritical一样,只是该API不会等待。
DeleteCriticalSection:它释放临界区对象使用的系统资源。此时临界区对象不能被任何线程占用。
LeaveCriticalSection: 释放对临界区对象的拥有权。