用自己的话总结【windows核心编程】

来源:互联网 发布:淘宝哪里进货 编辑:程序博客网 时间:2024/06/10 10:06

哈哈!

开始!!

为什么会有关键段这个东西?

首先我们已经有了Interlocked函数了,这些函数可以在用户态下进行多线程互斥,为什么可以在用户模式下进行多线程互斥呢?因为一般的认识来看的话,必须是多个线程可以共享的东西,当然全局变量符合这个条件,但是全局变量是不合适的,如果把一个全局变量当锁来用,我们会先判断一下他是不是可以用,假如可以用,我们就得把他变得不可用,就像厕所门一样,发现里面没人,我们就可以进去,然后把门锁上。但是这个锁门的动作是有风险的。为什么会有风险这里就不讲了。内核对象用来互斥是完全可以理解的,因为计算机的一切都是操作系统在控制,包括线程切换。应该来讲用户模式下是无法进行多线程互斥的,这个Interlocked函数到底有什么能耐?原来他可以在总线上维持一个硬件信号,这个信号会阻止其他CPU访问同一个内存地址。具体的原理还是不是很清晰,但是可以知道是硬件信号来进行保护的。

恩,这下我们知道Interlocked这个函数的原理了,这个函数一般怎么用的呐?这是一个系列。

Interlocked比较重要的应用在旋转锁上,旋转锁的时候,2个旋转的线程始终处于调度状态,浪费CPU严重。还是举厕所的例子,假如A是小便,那B时不时跑过去看看厕所还有没有人是可以的。但是假如A是大便,那B最好等较长的时间再去看比较好,对于计算机而言,应该让B回内核睡一会。

这里插播旋转锁的一些东西。

旋转锁就是在程序运行中,程序要确认现在门有没有打开,一般用程序表达的会是:while(门关着){...}。这样的缺点就是你发现门关着,你就一有机会就去看看。一旦发现门打开了,立马冲进去了。但是当你判断


Interlocked函数在用户模式下,你没办法让线程暂时睡一会啊。当然每次都让B睡觉是可以的,但是我们是不知道A是大便还是小便的,假如A小便,我们就亏了,B白睡了。

所以关键段就是一个比较好的策略了。这个书上讲的很清楚了。这里不重复了。



原创粉丝点击