首先,我们要明确,尽量避免资源的共享,典型的便是全局变量。如果不可避免,可考虑信号量与自旋锁,这是没办法中的办法。
明确一个概念 临界区:任何指定的时刻,代码只能被一个线程执行。
下面是总结的自旋锁和信号量的使用规则,注意了:有的是“必须”,不这样做就是bug;有的是“尽量”,不这样做会带来性能下降。
中断上下文必须用自旋锁,因为使用信号量万一休眠,没法唤醒,记住中断没有唤醒机制,
拥有自旋锁的线程不能休眠,试想下你在厕所睡着了,别人怎么办,太不道德,
自旋锁必须在可能的最短的时间内拥有,因为你在厕所享受,别人在门外焦急等待,尽量减少占用时间是王道,
如果中断例程可能试图拥有自旋锁,则必须先禁止中断(其实内核为我们提供了相应的自旋锁版本),
如果可能休眠则必须用信号量,上面已解释,
如果临界区较长,尽可能使用信号量,这时使用自旋锁浪费处理器,
如果临界区较短,尽量使用自旋锁,因为信号量所导致的处理器切换照样也是一种浪费。
非抢占式单处理器自旋锁不做任何事情;抢占式单处理器自旋锁也就是关抢占 。
如果问题,欢迎讨论。
阅读(1721) | 评论(0) | 转发(0) |