Zephyr RTOS -- Condition Variables

本笔记基于 Zephyr 版本 2.6.0-rc2

 

前言

本人正在学习 Zephyr,一个可移植性较强,可以兼容多种开发板及物联网设备的操作系统,如果你感兴趣,可以点此查看我的 学习笔记总述 进行了解!

 

Condition Variables - (条件变量)

条件变量是一种同步原语,它使线程能够等待特定条件发生。

 

1. Concepts - (概念)

可以定义任意数量的条件变量 (仅受可用 RAM 限制)。每个条件变量都由其内存地址引用。

为了等待条件变为真,线程可以使用条件变量。

条件变量基本上是一个线程队列,当某些执行状态(即某些条件)不理想(通过等待条件)时,线程可以把自己放在该队列上。函数 k_condvar_wait() 原子的执行以下步骤:

  1. 释放最后获取的互斥锁。
  2. 将当前线程放入条件变量队列中。

其他某个线程在更改所述状态时可以唤醒一个 (或多个) 等待线程,从而通过使用 k_condvar_signal()k_condvar_broadcast() 在条件上发出信号来允许它们继续执行,然后执行以下操作:

  1. 重新获取之前发布的互斥锁。
  2. k_condvar_wait() 返回。

条件变量必须在使用前进行初始化。

 

2. Implementation - (实现)

2.1 Defining a Condition Variable - (定义条件变量)

条件变量是使用 k_condvar 的类型变量定义的。然后必须通过调用 k_condvar_init() 来初始化它。

下面的代码定义了一个条件变量:

struct k_condvar my_condvar;

k_condvar_init(&my_condvar);

或者,可以在编译时通过调用 K_CONDVAR_DEFINE 来定义和初始化条件变量。

下面的代码和上面的代码段效果一样。

K_CONDVAR_DEFINE(my_condvar);

 

2.2 Waiting on a Condition Variable - (等待条件变量)

线程可以通过调用 k_condvar_wait() 来等待条件。

以下代码等待条件变量:

K_MUTEX_DEFINE(mutex);
K_CONDVAR_DEFINE(condvar)

void main(void)
{
    k_mutex_lock(&mutex, K_FOREVER);

    /* block this thread until another thread signals cond. While
     * blocked, the mutex is released, then re-acquired before this
     * thread is woken up and the call returns.
     */
    k_condvar_wait(&condvar, &mutex, K_FOREVER);
    ...
    k_mutex_unlock(&mutex);
}

 

2.3 Signaling a Condition Variable - (发送条件变量)

条件变量通过对一个线程调用 k_condvar_signal() 或对多个线程调用 k_condvar_broadcast() 来发出信号。

下面的代码建立在上面的例子之上。

void worker_thread(void)
{
    k_mutex_lock(&mutex, K_FOREVER);

    /*
     * Do some work and fullfill the condition
     */
    ...
    ...
    k_condvar_signal(&condvar);
    k_mutex_unlock(&mutex);
}

 

3. Suggested Uses - (建议用途)

使用带有互斥锁的条件变量来表示从一个线程到另一个线程的状态 (条件) 变化。 条件变量不是条件本身,也不是事件。 该条件包含在周围的编程逻辑中。

互斥体本身并不是为用作通知/同步机制而设计的。 它们旨在仅提供对共享资源的互斥访问。

 

4. Configuration Options - (配置选项)

相关配置选项:

  • None

 

参考链接

https://docs.zephyrproject.org/latest/reference/kernel/synchronization/condvar.html

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值