<<Windows驱动开发技术详解>>中有一段:
“
如果自旋锁已经被锁住,这时有程序申请“获取这个自旋锁”,程序则处于自旋状态。所谓自旋状态,就是不停的询问是否可以“获取”自旋锁。
......
而自旋锁原理则不同,它不会切换到别的线程,而是一直让这个线程“自旋”。因此,对自旋锁占用时间不宜过长,否则会导致申请自旋锁的其他线程处于自旋,折回浪费CPU宝贵的时间。
”
那我想问的问题是 : 1、自旋锁占用多久算比较合适?(即 占用时间 <= ??ms 算比较合适 ??)
2、假设我有一个int数组需要遍历,如果数组里有几百个项需要遍历,那时间会不会算多??int数组大到多少时就不适合用 自旋锁 来做同步了??
上面两个问题,请解答下。
总得来说,就是 自旋锁获取期间,执行多少条汇编指令算合适 ??那这个跟 具体CPU能力也有关系吧 ??
那我该如何拿捏这个度呢 ?像遍历这种操作是不适合放在自旋锁里面??
这几个问题也请指教下...
进入自旋锁后,通常中断已经被关闭,调度也已经被禁止。单一CPU下,CPU只专心处理一件事情,对其它紧急事件也置之不理。仅在多CPU情况下,其它CPU还可处理别的事件。
可见,自旋锁锁定的时间应当越短越好,毫秒级的时间太长了,微妙级为宜。时间较长时,除非很必须的情况下,不应该使用,以免影响CPU对其它事件的响应速度。
1.微秒以下为好,这个没有具体的标准,越短越好。具体使用哪一个,你可以根据情况对比一下自旋锁、信号量、事件、Mutex,更适合使用哪一个。
2.几百个项的数组访问适合使用。
(1)比如你上面说的访问数组,要保护数组只能被单独访问,对比一下自旋锁、信号量、事件、Mutex,由于访问数组的时间很短,所以有自旋锁最合适。
(2)如要独占写数据到一个文件,使用Mutex最合适。
(3)如要等待一个IO完成,那么使用事件或信号量。
由于进入自旋锁后,中断通常被禁止;如果有紧急的中断希望50微妙内能够响应,那么,自旋锁锁定的时间就不应该超过50微妙。
如果,整个系统中就没有特别紧急的事情,那么自旋锁的时间就可以长一点。可见,自旋锁的时间长短是因系统而定的,没有固定的时间限制。
如果一段程序非常短,执行时间非常快,那么与信号量相比,采用自旋锁的好处是:不会被中断或调度打断,而来回进出一次浪费时间。