当前位置: 首页 > news >正文

线程同步之双摄

如何实现两个摄像头进行同步,并利用同步的信号做一些事情, 比如stereo camera 做深度,如果是自己整的两个camera,同步就需要自己做, 那么这时候可以利用线程同步手写一个,下面给一个示例代码:

multi_producer_one_consumer

这段代码展示了如何通过生产者-消费者模型实现两个相机的数据同步,基于时间戳来判断相机数据是否同步。代码使用了信号量(semaphores)、**条件变量(condition variables)以及互斥锁(mutexes)**来保证线程安全和数据同步。

1. 信号量(semaphores)使用总结
  • 信号量初始化

    • 简单理解信号量就是当前的缓存剩余个数, 有了这个,你就不用定义数组的大小, 它会帮你控制
    • sem_init(&sem1, 0, MAX_ITEMS)sem_init(&sem2, 0, MAX_ITEMS) 分别初始化了相机1和相机2的信号量,初始值为 MAX_ITEMS(假设为 10)。
    • 初始值 10 表示队列中有 10 个可用的资源(例如 10 个空闲缓冲区空间)。
  • 信号量操作

    • sem_wait(&sem1)sem_wait(&sem2):当信号量大于 0 时,信号量减 1,并允许线程继续执行;如果信号量等于 0,线程会阻塞,直到有可用的资源。
    • 在使用sem_wait之后,如果线程没有被阻塞,也就是还有信号余量, 那么就开始生产,这个时候,就需要上一个锁,保护内存。
    • sem_post(&sem1)sem_post(&sem2):在数据处理完毕后,信号量加 1,表示释放了一个资源(例如,释放了队列中的一个空位)。
  • 信号量的作用:确保每个相机生产者线程在队列未满时才能继续生产新数据,并在队列满时阻塞,直到有空余空间为止。信号量用来控制队列的可用资源。

2. 条件变量(condition variables)使用总结
  • 条件变量的等待

    • 在使用条件变量的wait前一定要上一个锁,这个和sem.wait区别一下, 这个锁上完之后, 如果条件变量没有被满足,它会自动解锁。
    • cond.wait(lock, [&] { return !cameraDataQueue1.empty() && !cameraDataQueue2.empty(); });
      • 消费者线程会等待条件变量,只有在两个相机的队列都有数据时才会唤醒并进行数据处理。
      • 该条件确保在比较时间戳时,相机1和相机2的数据都已准备好。
  • 条件变量的通知

    • cond.notify_one();:生产者线程在生产完数据后,通知消费者线程继续工作。
  • 条件变量的作用:确保消费者线程只在有足够数据(即两个相机的数据都到达)时才会继续进行同步处理,防止不匹配的数据被处理。

3. 同步策略
  • 生产者-消费者模型:两个生产者线程(相机1和相机2)不断产生数据,并将数据放入各自的队列中。消费者线程(timestampComparator)则对两个相机的时间戳进行比对。

    • 每个相机的生产者线程使用信号量来控制生产的节奏,避免缓冲区溢出。
    • 消费者线程通过条件变量同步,确保在两个相机的数据到达后,才会进行时间戳比较。
  • 互斥锁:所有线程在访问共享的队列时都需要上锁,避免竞争条件(race conditions)。在操作队列时,使用 std::unique_lock<std::mutex> 来确保互斥访问。

4. 总结
  • 信号量:用来控制生产者的节奏,防止缓冲区溢出。当缓冲区满时,生产者线程会阻塞,等待消费者处理后继续生产。
  • 条件变量:用来确保消费者线程只有在满足特定条件(如相机1和相机2都有数据)时才会继续执行。
  • 同步策略:生产者-消费者模型,结合信号量和条件变量,实现了相机数据的同步处理和队列管理。
http://www.lryc.cn/news/467889.html

相关文章:

  • 使用 PyTorch 构建 LSTM 股票价格预测模型
  • 【C++篇】C++类与对象深度解析(五):友元机制、内部类与匿名对象的讲解
  • 模型训练进度条的代码
  • 直观理解反向传播 | Chapter 3 | Deep Learning | 3Blue1Brown
  • 052_python基于Python高校岗位招聘和分析平台
  • 基于物联网、大数据、人工智能等技术开发的Spring Cloud 智慧工地云平台源码,支持多端应用
  • 常见的跨境电商平台对比【总结表】
  • perl批量改文件后缀
  • 【Python中的字符串处理】正则表达式与常用字符串操作技巧!
  • 又是一年一度的1024,那就记录一篇算法博客吧~ 【二进制加法探秘】
  • LeetCode--买卖股票的最佳时机含冷冻期--动态规划
  • 装了Ubuntu和Windows双系统,如何设置默认启动Windows
  • WPF+MVVM案例实战-设备状态LED灯变化实现
  • MySQL--基本介绍
  • PAT甲级1008 Elevator
  • 数据导入导出
  • git的安装以及入门使用
  • 【acwing】算法基础课-搜索与图论
  • 502 错误码通常出现在什么场景?
  • 面试经典算法题69-两数之和
  • 在 Spring 框架中,循环依赖是指两个或多个 Bean 之间相互依赖
  • 一文带你入门Flink CDC
  • 修复jenkins SSH 免密登录发布服务器
  • 049_python基于Python的热门微博数据可视化分析
  • 中国信通院联合中国电促会开展电力行业企业开源典型实践案例征集
  • LOAM 20.04 ros1安装
  • Pyqt5设计打开电脑摄像头+可选择哪个摄像头(如有多个)
  • mysqldump 批量导出数据库表
  • 前端工程师面试题整理
  • Linux 权限的理解