【问题标题】:Kernel programming : wait queue uses spinlock internally内核编程:等待队列内部使用自旋锁
【发布时间】:2013-12-28 22:26:04
【问题描述】:

我正在努力在 char 设备驱动程序中实现阻塞调用。我将 wait_queue_head_t 元素与 wait_queue_interruptiblewake_up_interruptible 调用一起使用。我对阻塞行为的理解和阅读是,当呼叫被阻塞时,它会休眠(不是忙等待)并且不会消耗资源。但是当我在wait.h 中检查struct wait_queue_head 时,它使用了spin-lock。自旋锁具有不休眠的行为(忙于等待)..!所以这让我很困惑。请对此有帮助的任何澄清?我错过了什么吗?

【问题讨论】:

标签: c linux-kernel kernel linux-device-driver


【解决方案1】:

你发现的自旋锁的用途

struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;

};

是为了保护成员task_list不被并发访问。 如果你进入 wait_queue_interruptible(),你可以找到 schedule() 的调用。

【讨论】:

    【解决方案2】:

    扩展另一个答案:struct wait_queue_head 中的自旋锁用于保护内部列表成员,以防多个线程同时访问它。然而,自旋锁在进入休眠状态时永远不会被持有——它只会在操纵等待队列内部的小型、不可抢占、非休眠临界区期间持有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2021-11-28
      • 2016-11-02
      相关资源
      最近更新 更多