8 用户模式下线程的同步,一些函数而已。
1 InterlockedExchange InterlockedExchangeAdd InterlockedExchangePointer InterlockedCompareExchange……………………
2. 高速缓存行:_ _ d e c l s p e c ( a l i g n ( 3 2 ) )。最好是始终都让单个线程来访问数据(函数参数和局部变量是确保做到这一点的最好方法),或者始终让单个C P U访问这些数据(使用线程亲缘性)。如果采取其中的一种方法,就能够完全避免高速缓存行的各种问题。
3.高级线程同步 1.关键代码段 EnterCriticalSection DeleteCriticalSection | InitializeCriticalSection | LeaveCriticalSection TryEnterCriticalSection
4 InitializeSRWLock ReleaseSRWLockShared AcquireSRWLockShared 条件变量:SleepConditionVareableSRW SleepConditionVariableCS
9 线程与内核对象的同步
1 下面的内核对象可以处于已触发状态或未触发状态:■进程(终止是被触发)■ 文件修改通知■ 线程■ 事件■ 作业■ 可等待定时器■文件■ 信标■ 控制台输入■ 互斥对象,当内核对象触发时,可以使WaitFor系列函数返回。
2.Wa i t F o r S i n g l e O b j e c t。使用Wa i t F o r M u l t i p l e O b j e c t s函数两种方法:一种方式是让线程进入等待状态,直到指定内核对象中的任何一个变为已触发状态。另一种方式是让线程进入等待状态,直到所有指定的内核对象都变为已触发状态。
3 成功等待的副作用:例如,有一个线程正在等待自动清除事件对象(本章后面将要介绍)。当事件对象变为已触发状态时,函数就会发现这个情况,并将WA I T _ O B J E C T _ 0返回给调用线程。但是就在函数返回之前,该事件将被置为未触发状态,这就是成功等待的副作用。
4 事件内核对象 CreateEvent 可等待的定时器内核对象CreateWaitableTimer.等待定时器对象总是在未触发状态中创建。必须调用S e t Wa i t a b l e Ti m e r函数来告诉定时器你想在何时让它成为已触发状态.。M i c r o s o f t还允许定时器给在定时器得到通知信号时调用S e t Wa i t a b l e Ti m e r函数的线程的异步过程调用(A P C)进行排队。
5 信号量内核对象 通过调用R e l e a s e S e m a p h o r e函数,线程就能够对信标的当前资源数量进行递增.信号量的使用规则如下:
• 如果当前资源的数量大于0,则发出信标信号。
• 如果当前资源数量是0,则不发出信标信号。
• 系统决不允许当前资源的数量为负值。
• 当前资源数量决不能大于最大资源数量。
6 互斥对象内核对象 互斥对象(m u t e x)内核对象能够确保线程拥有对单个资源的互斥访问权。互斥对象包含一个使用数量,一个线程I D和一个递归计数器,I D用于标识系统中的哪个线程当前拥有互斥对象。互斥对象的使用规则如下:
• 如果线程I D是0(这是个无效I D),互斥对象不被任何线程所拥有,并且发出该互斥对象的触发信号。
• 如果I D是个非0数字,那么一个线程就拥有互斥对象,并且不发出该互斥对象的触发信号。
• 与所有其他内核对象不同, 互斥对象在操作系统中拥有特殊的代码,允许它们违反正常的规则(后面将要介绍这个异常情况)。
7 线程同步对象速查表
对象
何时处于未通知状态
何时处于已通知状态
成功等待的副作用
进程
当进程仍然活动时
当进程终止运行时(ExitProcess,TerminateProcess)
无
线程
当线程仍然活动时
当线程终止运行时(ExitThread,TerminateThread)
无
作业
当作业的时间尚未结束时
当作业的时间已经结束时
无
文件
当I / O请求正在处理时
当I / O请求处理完毕时
无
控制台输入
不存在任何输入
当存在输入时
无
文件修改通知
没有任何文件被修改
当文件系统发现修改时
重置通知
自动重置事件
ResetEvent,Pulse-Event或等待成功
当调用SetEvent/Puls Event时
重置事件
人工重置事件
ResetEvent或PulseEvent
当调用SetEvent/PulseEvent时
无
自动重置等待定时器
CancelWaitableTimer或等待成功
当时间到时(SetWaitableTime r)
重置定时器
人工重置等待定时器
CancelWaitableTimer
当时间到时(SetWaitableTimer)
无
信标
等待成功
当数量> 0时(ReleaseSe maphore)
数量递减1
互斥对象
等待成功
当未被线程拥有时(R e l e a s e互斥对象)
将所有权赋予线程
关键代码段(用户方式)
等待成功((Try)EnterCr iticalSection)
当未被线程拥有时(LeaveCriticalSection)
将所有权赋予线程
10 同步设备I/O与异步设备I/O
1 同步会阻塞线程。2 异步readfile io不会,内核会启动一个新的线程来处理IO。当然处理完成后需要通知原来的线程。
2 用来接收IO完成通知的方法 一,触发设备内核对象 二,触发事件内核对象 三,使用可提醒IO 四,使用IO完成端口
11,线程池的使用
新的线程池函数使你能够执行下列操作:
• 异步调用函数。
• 按照规定的时间间隔调用函数。
• 当单个内核对象变为已触发状态时调用函数。
• 当异步I / O请求完成时调用函数。