信号量
优质
小牛编辑
139浏览
2023-12-01
信号量接口
结构体 | |
struct | rt_semaphore |
信号量控制块 更多... | |
类型定义 | |
typedef struct rt_semaphore * | rt_sem_t |
信号量类型指针定义 | |
函数 | |
rt_err_t | rt_sem_init (rt_sem_t sem, const char *name, rt_uint32_t value, rt_uint8_t flag) |
初始化信号量 | |
rt_err_t | rt_sem_detach (rt_sem_t sem) |
脱离信号量 | |
rt_sem_t | rt_sem_create (const char *name, rt_uint32_t value, rt_uint8_t flag) |
创建信号量 | |
rt_err_t | rt_sem_delete (rt_sem_t sem) |
删除信号量 | |
rt_err_t | rt_sem_take (rt_sem_t sem, rt_int32_t time) |
获取信号量 | |
rt_err_t | rt_sem_trytake (rt_sem_t sem) |
无等待获取信号量 | |
rt_err_t | rt_sem_release (rt_sem_t sem) |
释放信号量 | |
详细描述
信号量接口
信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它, 从而达到同步或互斥的目的。信号量就像一把钥匙,把一段临界区给锁住,只允许 有钥匙的线程进行访问:线程拿到了钥匙,才允许它进入临界区;而离开后把钥匙 传递给排队在后面的等待线程,让后续线程依次进入临界区。
信号量是一种非常灵活的同步方式,可以运用在多种场合中。形成锁,同步,资源计数 等关系,也能方便的用于线程与线程,中断与线程的同步中。
函数说明
rt_err_t rt_sem_init | ( | rt_sem_t | sem, |
const char * | name, | ||
rt_uint32_t | value, | ||
rt_uint8_t | flag | ||
) |
初始化信号量
该函数将初始化信号量并将其置于内核管理器的控制之下。
- 参数
sem 指定的信号量对象句柄 name 信号量的名称 value 信号量初始化时的值 flag 信号量的标志位
- 返回
- RT_EOK
- 示例:
- producer_consumer.c , 以及 uart_sample.c.
rt_err_t rt_sem_detach | ( | rt_sem_t | sem | ) |
脱离信号量
该函数将把指定的静态信号量从内核对象管理器中移除。
- 参数
sem 指定的信号量对象
- 返回
- 脱离成功返回 RT_EOK
rt_sem_t rt_sem_create | ( | const char * | name, |
rt_uint32_t | value, | ||
rt_uint8_t | flag | ||
) |
创建信号量
调用该函数时,系统将先从对象管理器中分配一个semaphore对象,并初始化这个对象, 然后初始化 IPC 对象以及与 semaphore 相关的部分。。
- 参数
name 信号量的名称 value 信号量初始化时的值 flag 信号量的标志位
- 返回
- 返回创建的信号量控制块, 当错误时返回 RT_NULL
rt_err_t rt_sem_delete | ( | rt_sem_t | sem | ) |
删除信号量
系统不再使用信号量时,可通过删除信号量以释放系统资源,适用于动态创建的信号量。 调用该函数将删除一个信号量对象,并释放其占用的内存空间。
- 参数
sem 信号量对象句柄
- 返回
- RT_EOK删除成功
rt_err_t rt_sem_take | ( | rt_sem_t | sem, |
rt_int32_t | time | ||
) |
获取信号量
线程通过调用该函数获取信号量来获得信号量资源实例,当信号量值大于零时,线程将获得信号量, 并且相应的信号量值会减 1;如果信号量的值等于零,那么说明当前信号量资源实例不可用,申请 该信号量的线程将根据 time 参数的情况选择直接返回、或挂起等待一段时间、或永久等待,直到 其他线程或中断释放该信号量。
- 参数
sem 信号量对象的句柄 time 指定的等待时间,单位是操作系统时钟节拍(OS Tick)
- 返回
- RT_EOK 成功获得信号量;-RT_ETIMEOUT 超时依然未获得信号量;-RT_ERROR 其他错误
rt_err_t rt_sem_trytake | ( | rt_sem_t | sem | ) |
无等待获取信号量
当用户不想在申请的信号量上挂起线程进行等待时,可以调用该函数以无等待方式获取信号量。
- 参数
sem 信号量对象的句柄
- 返回
- RT_EOK 成功获得信号量;-RT_ETIMEOUT 获取失败
rt_err_t rt_sem_release | ( | rt_sem_t | sem | ) |
释放信号量
该函数将释放一个信号量,当信号量的值等于零时,并且有线程等待这个信号量时, 释放信号量将唤醒等待在该信号量线程队列中的第一个线程,由它获取信号量;否则 将把信号量的值加一。
- 参数
sem 信号量对象的句柄
- 返回
- RT_EOK 成功释放信号量