# Day 3 IPC ![alt text](image-3.png) ![alt text](image.png) 1. √ 2. ? 3. ## 临界区 only one can use the resource at a time 有人用了,别人就不能用 ## 阻塞非阻塞 Blocking/Non-blocking ![alt text](image-1.png) 阻塞: 等待,一个线程 ??? 非阻塞: 不等待 ## 挂起 ??? ## 死锁 两个线程互相等待 ![alt text](image-2.png) ## 信号量 用于线程间同步、互斥 - 二值信号量 约等于bool 获得1,不得0 ![alt text](image-4.png) - 计数信号量 初始为期待的值??? - ![alt text](image-5.png) ??? - 裸机 根据全局变量flag 反应(错误、破坏、不能挂起一直停在这……???) - 用系统的api,不要flag - 三种反应:一直等,等一会,不等 ## api ### √ 创建信号量(动态)节省资源,动态分配,可能内存破坏 ??? 注意区别? ``` c rt_sem_t rt_sem_create(const char* name, rt_uint32_t value, rt_uint8_t flag); // flag:RT_IPC_FLAG_FIFO先进先出/RT_IPC_FLAG_PRIO优先级 ``` ### √ 删除信号量 ??? ``` c rt_err_t rt_sem_delete(rt_sem_t sem); ``` ### 初始化信号量(静态)还在内存,别人也用不了 ``` c rt_err_t rt_sem_init(rt_sem_t sem, const char* name, rt_uint32_t value, rt_uint8_t flag); ``` ### 脱离信号量 从内核对象管理器中脱离 ### 获取信号量 time 单位tick ??? ![alt text](image-6.png) ### 无等待获取信号量 ``` c rt_err_t rt_sem_trytake(rt_sem_t sem); ``` ### 释放信号量 ``` c rt_err_t rt_sem_release(rt_sem_t sem); ```