RT_THREAD线程的同步和通讯
一 线程同步:信号量,互斥量,事件集
信号量:(任何线程都可释放,已经不存在实例,线程递归持有会发生主动挂起(最终形成死锁),优先级反转)
生成者(线程1)-共享数据(临界区)-消费者(线程2)模型中对共享数据的操作;对SPI总线的占有操作要互斥;对临界区的保护rt_hw_interrupt_disable/enable();rt_enter/exit_critical()。
信号量的等待方式:RT_IPC_FLAG_FIFO/PRIO;
信号量的值:还有多少个资源可用(资源计数:停车场的空余可用车位数/生成消费模型中的信号量的初始化值=max;开始申请不能运行的初始化值一般为0(相当于工作完成标志flag);锁(二值信号量,初始可用则设为1(成功申请后减一;释放后加1);中断与线程同步(初始为0,中断中释放信号量加1),而中断与线程之间的互斥不能用锁)。获取信号量只要大于0即可以得到资源(等待方式:直接返回(rt_sem_trytake()),挂起,超时等待,死等)。
互斥量(信号量的一种,锁形式存在(互斥锁)。只有占有者释放,支持递归访问且能因采用优先级继承算法防止线程优先级翻转的场合):状态:申请获得后闭锁,释放后开锁(减一,为0可用)
事件集(一对多,多对多):进行与(关联型事件)或(独立型事件,不可累计):
32bit,操作方式分为RT_EVENT_FLAG_AND(逻辑与),RT_EVENT_FLAG_OR(逻辑或)以及 RT_EVENT_FLAG_CLEAR(清除标记,线程唤醒后将对应位清零)
发送事件集:让有等待该事件的任务进入就绪;接收事件集:达到条件则就绪否则加入等待列表。
1 2 3 4 5 6 7 8 9 10 11 12 | #define EVENT_FLAG3 (1 << 3) #define EVENT_FLAG5 (1 << 5) /* 第一次接收事件,事件 3 或事件 5 任意一个可以触发线程 1,接收完后清除事件标志 */ if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5), RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &e) == RT_EOK) /* 第二次接收事件,事件 3 和事件 5 均发生时才可以触发线程 1,接收完后清除事件标志 */ if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5), RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &e) == RT_EOK) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?