Windows核心编程 (7)

用户方式中线程的同步
1.The InterlockExchangeAdd function performs an atomic addition of an increment value to an addend variable.

The function prevents more than one thread from using the same variable simultaneously.
 
2.InterlockedExchange和InterlockedExchangePointer能够以原子操作方式用第二个参数中传递的值来取代第一个参数中传递的当前值。
 
3.The InterlockedCompareExchange function performs an atomic comparison of the values specified in the Destination and Comperand parameters and exchange of the values, based on the outcome of the comparison. The function prevents more than one thread from using the same variable simultaneously.
 
4.当一个CPU从内存读取一个字节时,它不只是取出一个字节,它要取出足够的字节来填入高速缓存行。高速缓存行由32或64个字节组成(视 CPU而定),并且始终在第32个字节或第64个字节的边界上对齐。高速缓存行的作用是为了提高CPU运行的性能。但是,在多处理器环境中,高速缓存行使 得内存的更新更加困难。这一切意味着你应该将高速缓存行存储块中的和高速缓存行边界上的应用程序数据组合在一起。这样做的目的是确保不同的CPU能够访问 至少由高速缓存行边界分开的不同的内存地址。还有,应该将只读数据(或不常读的数据)与读写数据分开。同时,应该将同一时间访问的数据组合在一起。
 
5.不应该在单处理器计算机上使用循环锁,甚至在多处理器计算机上,也应该小心地使用它们。CPU时间是非常宝贵的。
 
6.volatile限定词会告诉编译器,不要对该变量进行任何优化,并且总是重新加载来自该变量的内存单元的值。
 
7.当无法用互锁函数来解决同步问题时,你应该试用关键代码段。关键代码段的优点在于它们的使用非常容易,它们在内部使用互锁函数,这样它们就能够迅速运行。关键代码的主要缺点是无法用它们对多个进程中的各个线程进行同步。
 
8.关键代码段:创建一个CRITICAL_SECTION结构->调用InitialCriticalSection初始化结构 ->当线程要访问关键代码的时候调用EnterCriticalSection来获得访问权->当线程要退出关键代码的时候调用 LeaveCriticalSection来释放访问权。
当线程不再访问共享资源时候,应该调用DeleteCriticalSection来清除CriticalSection结构。
可以使用TryEnterCriticalSection来取代EnterCriticalSection函数,TryEnterCriticalSection函数决不允许调用线程进入等待状态。相反,它的返回值能够指明调用线程是否能够获得对资源的访问权。
 
9.当线程试图进入另一个线程拥有的关键代码段时,调用线程就立即被置于等待状态。这意味着该线程必须从用户方式转入内核方式(大约1000个 CPU周期)。这种转换是要付出很大代价的。为了提高关键代码段的运行性能,Microsoft将循环锁纳入了这些代码段。因此,当 EnterCriticalSection函数被调用时,它就使用循环锁进行循环,以便设法多次取得该资源。只有当为了取得该资源的每次试图都失败时,该 线程才转入内核方式,以便进入等待状态。若要将循环锁用于关键代码段,因改调用 InitializeCriticalSectionAndSpinCount函数。
 
10.InitializeCriticalSection函数的运行可能失败(尽管可能性很小)。因为它分配了一个内存块以便系统得到一些内 部调试信息。如果该内存的分配失败,就会出现一个STATUS_NO_MEMORY异常情况。当使用关键代码段时还会出现另一个问题。从内部来说,如果两 个或多个线程同时争用关键代码段,那么关键代码段将使用一个事件内核对象。在内存不足的情况下,关键代码段可能被争用,同时系统可能无法创建必要的事件内 核对象。这时EnterCriticalSection函数将会产生一个EXCEPTION_INVALID_HANDLE异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值