- 论坛徽章:
- 0
|
回复 #2 xhbdahai 的帖子
自旋锁是一个基本的概念:
1.Linux中,没有用户态的自旋锁,spin_lock用在内核中。其作用是为了保护临界资源不会被多个线程同时访问。持有自旋锁的代码区域通常被称作临界区。
2.所谓自旋,就是如果一个内核线程A(B,C或者更多)想要获取这个锁S时,但是这个锁已经被其他内核线程T持有,那么A(B,C和其他)线程将一在一个循环中不停的测试锁S的状态,其中等待线程中(A,B,C或者更多)的某一个线程将在T释放自旋锁S之后获取它而退出测试循环。而其他没有获取到的线程将继续对S的测试。自旋因此而得名!
另外,目前的内核中spin_lock好像没有超时的版本,所以他不会在等待一定时间后停止自旋。除非使用spin_trylock,之测试一次!
3.处于自旋锁保护的临界区对于Kernel来说,属于原子操作区域。Kernel不允许在原子操作区内的进程睡眠(睡眠实质上是由于某种原因而主动让出CPU)。否则,既有可能导致死锁!
4.同样,处于自旋锁保护的临界区内kernel不允许被抢占,抢占会在进入临界区时被禁止。
5.在某些情况下,处于自旋锁的临界区也不能不中断,如果你的中断处理中需要持有同样的自旋锁,那么将会导致死锁。这中情况需要程序员小心处理。对付这种问题,可能会需要在关中断的情况下进入临界区。在处理完临界区之后再使能中断! |
|