选择同步对象
本页依据 文档基线与后续更新 中记录的 Zephyr main 快照更新。
同步对象表达的语义不同,应先确定“要保护资源、记录次数,还是等待状态”。
对象 |
适用场景 |
关键限制 |
|---|---|---|
资源计数、ISR 通知线程 |
计数达到上限后不会继续累积;没有所有者 |
|
保护共享资源的临界区 |
有线程所有者、支持优先级继承;不能用于 ISR |
|
在互斥量保护下等待某个条件成立 |
条件存在于应用状态中;要在循环内检查 |
|
等待一组状态位中任意或全部条件 |
位重复置位不累计次数 |
|
同时等待多个对象就绪 |
通知就绪不等于已取得资源 |
对象内部同步不自动保护其外部数据。例如 ISR 给出信号量后,生产者仍可能覆盖同一缓冲区;
应用必须设计数据所有权、队列或双缓冲。普通 volatile 也不能替代互斥量、原子操作或
恰当的中断同步。
涉及多个对象时先定义一致的加锁顺序。超时表示等待结果,不能简单忽略后继续访问资源。 在错误路径、取消和线程退出时,同样需要完成已经取得的资源释放。