2013-12-11 39 views
0

我正在实现char设备驱动程序中的阻塞调用。我用wait_queue_interruptiblewake_up_interruptible调用wait_queue_head_t元素。我了解并了解阻止行为的原因是,当呼叫被阻止时,它会睡眠(不忙等待)并且不会占用资源。但是当我在wait.h中检查struct wait_queue_head时,它使用spin-lock。自旋锁具有不睡眠的行为(忙等待)..!所以这让我困惑。任何澄清,以帮助这个请吗?我错过了什么吗?内核编程:等待队列在内部使用螺旋锁

+0

请看看[这里](http://stackoverflow.com/questions/5869825/when-should-one-use-a-spinlock-instead-of-mutex)。 –

回答

2

自旋锁的目的,你在

struct __wait_queue_head { 
spinlock_t lock; 
struct list_head task_list; 

}找到;

是为了防止成员task_list的并发访问。 如果您进入wait_queue_interruptible(),您可以找到调度schedule()。

1

要扩展另一个答案:struct wait_queue_head内部的自旋锁用于保护内部列表成员,以防多个线程同时访问它。然而,睡觉时永远不会保持螺旋锁 - 它只能在处理等待队列内部的小的,不可抢占的非睡眠关键部分期间保持。