目录RT-thread学习笔记(二)——信号量基本概念使用方法特殊的信号量 使用方法 特殊的信号量

信号量是线程间同步的一种方式,其本质上就是一个多个线程可以共同访问的全局变量。形式上,每当某线程进行取信号量操作时,若信号量值大于零,该变量减一,线程继续执行并在之后释放信号量使其值加一。当然,当某线程进行取信号量操作时,若信号量值等于零,该线程进入挂起状态,脱离就需队列,等待其他线程释放信号量。

使用方法

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这种实时操作系统显然是不可以接受的。
所以,就有了互斥量的出现。