- 论坛徽章:
- 0
|
大家可以参考:http://bbs.chinaunix.net/forum.p ... p;authorid=10234898
设想:两个core,两个线程A和B,分别运行在core1和core2上,互斥锁mutex_x
1)当A获取到mutex_X,B又去获取mutex_x,显然,获取失败,此时B让出CPU,给其他线程运行
2)后来当A释放mutex_x之后,回去唤醒B,但是在core2上,需要调度执行的是其他线程,那么B只有等待被再次调度执行才能获取到mutex_x
3) 在B等待调度的过程中,A获得调度,又去申请mutex_x,此时A又能成功获得mutex_x
即:B得到mutex_x的等待时间不确定,可能会很长,而使用spinlock的话,当A一释放mutex,B可以立即获得,并继续执行进入临界区。
结论:
1)使用mutex,有切换,效率上就有影响
2)但同样对临界区实现了互斥,可以使用在SMP上。
3)至于在SMP上,是否需要使用mutex,要考虑应用场景,不断进行系统优化。
两种锁适用于不同场景:
如果是多核处理器,如果预计线程等待锁的时间很短,短到比线程两次上下文切换时间要少的情况下,使用自旋锁是划算的。
如果是多核处理器,如果预计线程等待锁的时间较长,至少比两次线程上下文切换的时间要长,建议使用互斥量。
注:两次上下文切换时间在实际系统中并不总是确定的,因此这里仅仅是参考方案,需要根据实际进行test,做优化。
不妥之处,请指正!
|
|