条件变量

条件变量

条件变量简介

条件变量(condition variable)是为了等待某个条件成立而设计,提供一种线程间通知机制,在条件成立之前,等待线程进入睡眠状态,当某个条件成立时,信号端发射signal/broadcast来“唤醒”等待线程。

pthread条件变量相关的函数主要有以下5个:

#include <pthread.h>
int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr* cond_attr);
int pthread_cond_destroy(pthread_cond_t* cond);
int pthread_cond_broadcast(pthread_cond_t* cond);
int pthread_cond_signal(pthread_cond_t* cond);
int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex* mutex);

以上函数均以返回0表示成功,非0表示出错。

条件变量的资源申请分为静态和动态两种,分别为:

  • pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 使用宏将条件变量各个字段初始化为0
  • 调用pthread_cond_init/pthread_cond_destroy为动态初始化和销毁条件变量资源

条件变量的使用

条件变量需结合互斥量(mutex)一起使用。pthread_cond_wait等待条件成立时需配备一个mutex来保护等待操作的原子性,调用pthread_cond_wait之前,需确保mutex已经加锁,否则将导致不可预期行为。pthread_cond_wait函数执行时,首先将mutex解锁,然后判断条件是否成立,待该等待函数成功返回后,mutex重新被加锁。

条件变量是一个或多个线程等待某个布尔表达式为真,下面推荐打开条件变量正确的姿势。

对于wait端:

  1. 必须与mutex一起使用,该布尔表达式的读写操作受此mutex保护;
  2. 在调用pthread_cond_wait之前必须先对mutex加锁;
  3. 把判断布尔条件和wait操作放在while循环中,而非if语句中

对于signal/broadcast端:

  1. 不一定在mutex上锁的情况下调用signal;
  2. 在signal之前一般需要修改布尔表达式;
  3. 修改布尔表达式需要mutex保护;
  4. 注意区分signal和broadcast。
MutexLock mtx;
Condition cond(mtx);
std::deque<int> queue;

// wait端
int Dequeue() {
  MutexLockGuard lk(mtx);
  while(queue.empty()) {
    cond.Wait();
  }
  assert(!queue.empty());
  int top = queue.front();
  queue.pop_front();
  return top;
}

// signal端
void Enqueue(int x) {
  MutexLockGuard lk(mtx);
  queue.push_back(x);
  cond.notify();
}

参考:

【1】《Linux多线程服务器编程》——陈硕

【2】《UNP》

转载于:https://www.cnblogs.com/bigosprite/p/11068687.html

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同时可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值