
信号量是线程间同步的一种方式,其本质上就是一个多个线程可以共同访问的全局变量。形式上,每当某线程进行取信号量操作时,若信号量值大于零,该变量减一,线程继续执行并在之后释放信号量使其值加一。当然,当某线程进行取信号量操作时,若信号量值等于零,该线程进入挂起状态,脱离就需队列,等待其他线程释放信号量。
使用方法
static rt_sem_t test_sem = RT_NULL;
test_sem = rt_sem_create("test_sem", //信号量名
5, //信号量初值
RT_IPC_FLAG_FIFO); //操作信号量方式
if (test_sem != RT_NULL) //监测信号量初始化是否成功
{
rt_kprintf("信号量初始化成功!");
}
//一般在线程入口函数中对信号量进行操作
void thread_entry(void* parameter)
{
dosomething();
rt_err_t uwRet = RT_EOK;
uwRet = rt_sem_take(test_sem, RT_WAITING_FOREVER);
if (uwRet == RT_EOK)
rt_kprintf("获取信号量成功!");
dosomething();
uwRet = rt_sem_release(test_sem);
}
特殊的信号量
信号量中存在一种特殊的信号量,他的最大值为一,叫做二值信号量。显然,他的作用是让两个线程互斥执行。但通过二值信号量完成该目标会导致优先级反转的问题。
设想现在有High、Middle和Low三个优先级的线程,Low首先拿到了和High竞争的二值信号量,之后Middle又拿到了与Low竞争的二值信号量。Low因为没有取到信号量而挂起,High作为优先级最高的线程却在等待Middle线程结束,才可以继续执行,这对与rtt这种实时操作系统显然是不可以接受的。
所以,就有了互斥量的出现。




近期评论