【问题标题】:Usage of spinlocks and semaphore in linux in process and interupt contextlinux中自旋锁和信号量在进程和中断上下文中的使用
【发布时间】:2015-11-07 22:35:52
【问题描述】:

如果我在中断上下文中使用信号量和互斥锁会发生什么? 通常信号量用于同步机制。如果我在中断上下文中使用这个会发生什么?

我正在做一个关于 gpio 引脚的项目,当中断发生时,我必须在 ISR 中发送一个信号。我正在使用自旋锁。

如果我在 ISR 中使用信号量和 mutext 会发生什么?

【问题讨论】:

    标签: linux-kernel synchronization mutex spinlock binary-semaphore


    【解决方案1】:

    在互斥锁和信号量中的等待是通过将当前任务状态切换到TASK_INTERRUPTIBLE/TASK_UNINTERRUPTIBLE 来实现的,并且与进一步调用schedule() 类似。

    在当前任务状态与TASK_RUNNING 不同的情况下调用schedule() 会导致切换到另一个进程。如果current 指的是中断上下文,你将永远不会回到它,因为调度只能切换到进程

    因此,当您在中断上下文中锁定竞争(即当前锁定)信号量/互斥体时,您只是丢失了当前执行“线程”。

    如果您锁定了未竞争(当前未锁定)的信号量/互斥量,则执行将是正确的,但系统日志中会出现有关信号量/互斥量使用不当的警告。

    【讨论】:

    • current 在任何时候都不会为 NULL。所以在中断上下文中休眠将使用当前任务的线程信息来存储能够被调度的信息。所以根本原因可能不是它。我说的对吗?
    • @Arthur 看起来是正确答案quora.com/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 2010-09-16
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多