读《windows核心编程》笔记2

来源:互联网 发布:mac ps cs6 破解文件 编辑:程序博客网 时间:2024/05/01 01:50

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请求完成时调用函数。


 

原创粉丝点击