互斥量

本页依据 文档基线与后续更新 中记录的 Zephyr main 快照更新。

互斥量用于线程之间独占共享资源。它记录所有者和递归加锁次数,并通过优先级继承缓解 高优先级线程等待低优先级所有者造成的优先级反转。ISR 不能使用互斥量。

定义与加锁

#include <zephyr/kernel.h>

K_MUTEX_DEFINE(state_lock);
static unsigned int shared_count;

int increment_count(void)
{
    int rc = k_mutex_lock(&state_lock, K_MSEC(50));

    if (rc != 0) {
        return rc;
    }
    shared_count++;
    return k_mutex_unlock(&state_lock);
}

动态初始化使用 k_mutex_init()。锁已被其他线程持有时,可选择立即返回、限时等待或 一直等待。成功返回 0 后才拥有访问权限。

K_NO_WAIT 获取失败返回 -EBUSY;等待超时返回 -EAGAIN。 解锁必须由所有者执行;对未锁定或不属于当前线程的互斥量解锁会返回错误。

递归与优先级继承

同一线程可重复锁定同一个互斥量,但必须以相同次数解锁,最后一次解锁才真正释放。 此特性不能解决多个锁之间的循环依赖;多锁路径需要一致的获取顺序。

高优先级等待者可使持锁线程临时提高优先级,提升范围受 CONFIG_PRIORITY_CEILING 等配置影响。嵌套持有多个互斥量时,优先级恢复存在需要 谨慎处理的情况,尽量保持临界区短小并减少多锁嵌套。

正确的资源边界

锁定期间避免长时间 I/O、等待其他任务或调用可能再次进入不明确锁路径的代码。 所有错误返回路径都应释放本次已取得的锁。 对象销毁前保证没有持有者或等待者;应用不能通过线程退出自动获得所有资源清理。 需要从 ISR 向线程通知时使用信号量、FIFO 或工作队列,再在线程中加锁处理数据。

上游依据