概念
可以定义任意数量的条件变量(仅受可用 RAM 的限制)。每个条件变量都由其内存地址引用。
要等待条件变为真
,线程可以使用条件变量。
条件变量基本上是一个线程队列,当某些执行状态不符合预期时,线程会阻塞。函数k_condvar_wait()
以原子方式执行以下步骤:
- 释放上次获取的互斥锁。
- 将当前线程放在条件变量队列中。
当条件变量状态改变时,可以唤醒一个或多个等待线程。
当阻塞线程获取到k_condvar_signal()
或k_condvar_broadcast()
发出的条件信号时,它执行如下步骤:
- 重新获取先前发布的互斥锁。
- 从
k_condvar_wait()
返回。
必须先初始化条件变量,然后才能使用它。
定义条件变量
条件变量是使用k_condvar
类型定义的变量。然后必须通过调用k_condvar_init()
对其进行初始化。
struct k_condvar my_condvar;
k_condvar_init(&my_condvar);
也可以通过调用K_CONDVAR_DEFINE
在编译时定义和初始化条件变量。
K_CONDVAR_DEFINE(my_condvar);
等待条件变量
线程可以通过调用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);
}
向条件变量发出信号
通过为一个线程调用k_condvar_signal()
或通过对多个线程调用k_condvar_broadcast()
来发出条件变量的信号。
void worker_thread(void)
{
k_mutex_lock(&mutex, K_FOREVER);
/*
* Do some work and fulfill the condition
*/
...
...
k_condvar_signal(&condvar);
k_mutex_unlock(&mutex);
}
条件变量与互斥锁
将条件变量
与互斥锁
一起使用,以指示从一个线程到另一个线程的状态变化。条件变量不是条件本身,也不是事件。
互斥锁本身不是为用作通知/同步
机制而设计的。它们旨提供对共享资源的互斥访问。