2013-12-11 72 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內部的自旋鎖用於保護內部列表成員,以防多個線程同時訪問它。然而,睡覺時永遠不會保持螺旋鎖 - 它只能在處理等待隊列內部的小的,不可搶佔的非睡眠關鍵部分期間保持。