选择同步对象

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

同步对象表达的语义不同,应先确定“要保护资源、记录次数,还是等待状态”。

对象

适用场景

关键限制

信号量

资源计数、ISR 通知线程

计数达到上限后不会继续累积;没有所有者

互斥量

保护共享资源的临界区

有线程所有者、支持优先级继承;不能用于 ISR

条件变量

在互斥量保护下等待某个条件成立

条件存在于应用状态中;要在循环内检查

事件对象

等待一组状态位中任意或全部条件

位重复置位不累计次数

轮询多个内核对象

同时等待多个对象就绪

通知就绪不等于已取得资源

对象内部同步不自动保护其外部数据。例如 ISR 给出信号量后,生产者仍可能覆盖同一缓冲区; 应用必须设计数据所有权、队列或双缓冲。普通 volatile 也不能替代互斥量、原子操作或 恰当的中断同步。

涉及多个对象时先定义一致的加锁顺序。超时表示等待结果,不能简单忽略后继续访问资源。 在错误路径、取消和线程退出时,同样需要完成已经取得的资源释放。

上游依据