OpenThreads库介绍——Condition

OSG场景的多线程渲染,基本场景渲染过程——b站72讲17讲+书籍 osg72讲 阅读详情

1. 简介

Condition 类是条件变量。它依赖于某个Mutex 互斥体,互斥体加锁时阻塞所在的线程,解锁或者超过时限则释放此线程,允许其继续运行。这里涉及了几个线程操作中重要的概念:同步,阻塞以及条件变量。线程同步,简单来说就是使同一进程的多个线程可以协调工作,例如让它们都在指定的执行点等待对方,直到全员到期之后才开始同步运行;拥塞,即强制一个线程在某个执行点上等待,直到满足继续运行的条件为止。例如其它的线程到达同一执行点,某个变量初始化完成等等,可以通过条件变量来设计各种条件。

条件变量有点类似于一种事件,用来通知两个或者更多线程。可以让一个或者多个线程等待条件变量的通知,另一个线程可以触发这些通知。

关于条件变量的使用场景可以参考条件变量(Condition Variable)详解

2. 使用方式

OSG里面的条件变量提供的接口非常少,下面一一列举:

  • wait(Mutex *mutex)
    用来获取一个Mutex,并且判断当前条件是否满足,如果条件不满足,那么进入到阻塞状态,并且释放这个Mutex

  • wait(Mutex *mutex, unsigned long int ms)
    获取一个Mutex,等待ms的时间

  • signal
    其他线程的线程通过调用这个函数来唤醒阻塞的一个线程

  • broadcast
    其他线程通过调用这个函数来唤醒所有被阻塞的线程

关于条件变量的使用方式,可以参考《用条件变量实现事件等待器的正确与错误做法》

3.示例程序

#include "header.h"
#include <OpenThreads/Thread>
#include <OpenThreads/Condition>
#include <OpenThreads/Mutex>
#include <OpenThreads/ScopedLock>
#include <iostream>


OpenThreads::Mutex g_mutex;
OpenThreads::Condition g_condition;
bool ready = false;

//WorkThread是被阻塞,等待唤醒的线程
class WorkThread : public OpenThreads::Thread
{
public:
    WorkThread(){ }

    void run()
    {
        OpenThreads::ScopedLock<OpenThreads::Mutex> mutex(g_mutex);
        while (!ready)
        {
            g_condition.wait(&g_mutex);
        }
        std::cout << "Work Thread Wake up and coming" << std::endl;
    }
};

//NodifyThread是唤醒被阻塞线程的线程
class NotifyThread : public OpenThreads::Thread
{
public:
    NotifyThread(){}

    void run()
    {
        std::cout << "Start Notify Thread" << std::endl;
        OpenThreads::ScopedLock<OpenThreads::Mutex> mutex(g_mutex);
        ready = true;
        std::cout << "Work Thread Go!" << std::endl;
        g_condition.signal();

    }
};


int main()
{
    WorkThread w;
    NotifyThread n;
    w.start();
    n.start();
    w.join();
    n.join();

4. 参考资料

1. std::condition_variable

2. 条件变量(Condition Variable)详解

3. 用条件变量实现事件等待器的正确与错误做法

OpenThreads-开源 该库旨在为 C++ 程序员提供最小且完整的面向对象 (OO) 线程接口。 它以 Java 线程 API 和 POSIX 线程标准为松散模型。 图书馆的架构是围绕\ 立即下载

相关推荐

OpenThreads库API手册(osg3.6.0)

自己编译的OpenThreads手册,chm格式的,欢迎下载。(该资源只有OpenThreads API,不包含OSG,如果需要OSG请搜索我的其他资源)

OpenThreads线程库

OpenThreads与pthread不同点在于,他是根据面向对象开发的。 一、OpenThreads在线程同步上不同于之前我所了解的(比如pthread),除了常用的几路,他还提出了额外的。 传统的: 1. 互斥量OpenThreads::Mutex类 当线程使用某一资源时,先使用互斥量加锁。由于采用了面向对象机制将互斥量抽象为一个类,所以不像pthread函数那样传入个参数。Mutex

4469

OpenThreads

osg3.2.1的64位,ot20-OpenThreads,包含debug,realease版的。

OpenThreads库介绍——Thread

OpenThreads库是一个轻量级的跨平台多线程库,在2.x之前是独立发展的一个库,在2.x后并入到OSG的源码中,OSG中大量的多线程操作都是基于这个库编写的。(事实上使用该库是历史原因的问题,在OSG创立的时候,C++标准中并没有C++11引入的线程库),库的详细介绍参考:OpenThreads站点 Thread线程 线程实现类。它是一个面向对象的线程实现接口,每定义一个Thread...

Frank的专栏 7259

OpenThreads3.3.1.21

从OpenSceneGraph-3.6.3提取出来的OpenThreads3.3.1.21,通过CMAKE可以在WIN和LINUX下编译通过。

VsCode+JLink+GCC替代Keil开发GD32程序-个人总结

对个人使用vscode+Jlink开发GD32程序做了总结,供需要者参考。

MyCollege1999的博客 2764

OpenThreads库学习

在看STM32资料中看到STM32WB系列“双核无线微控制器配备双核无线微控制器(MCU)配备Bluetooth® 5、OpenThread和ZigBee®3.0连接技术,同时兼备超低功耗性能“不知道这个OpenThread是啥东东: OpenThread库:提供了一个Thread类,供用户创建自己的线程。其使用非常方便,用户只需要继承自OpenThreads::Thread类,#in...

weixin_30905981的博客 698

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡 一、板卡概述 基于XC7Z100+ADRV9009的双收双发无线电射频板卡是基于XilinxZYNQFPGA和ADI的无线收发芯片ADRV9009开发的专用功能板卡,用于5G小基站,无线图传,数据收发...

9367

【OSG原理与源码分析】OSG多线程模块:OpenThreads之C++跨平台多线程编程库那点事

简介本文将介绍跨平台多线程库的设计方案,还将介绍开源三维图形框架OSG(Open Scene Graph)中的跨平台多线程库OpenThreads的初步理解的一些基础知识。

cgprofessional的博客 833

国产数据库迁移必看:达梦到ES的CDC方案优化全记录(含完整代码)

本文详细记录了从达梦数据库到Elasticsearch的CDC方案优化全过程,涵盖触发器方案局限性、Debezium架构优势及完整代码实现。通过Flink集成和性能调优,实现毫秒级延迟同步,显著降低数据库负载,为国产数据库迁移提供可落地的技术方案。

weixin_29079671的博客 499

图像特征(一)——颜色特征(颜色直方图,颜色矩,颜色集,颜色聚合向量和颜色相关图)

本文主要是为了更好地理解图像特征,理解各方法的原理。转载请注明出处https://mp.youkuaiyun.com/console/editor/html/105090183 图像模式识别的一般步骤为:输入图像--图像预处理--特征提取--特征选择--图像分类--输出结果。 图像特征主要有:颜色特征、形状特征、纹理特征和空间关系特征。 本文主要介绍颜色特征,并给出matlab上实现的demo。 颜...

gloria_iris的博客 3万+

OpenThreads库的使用-Condition

Condition简介Condition,条件变量。当条件没达到时,线程阻塞。当条件达到时,线程运行。 OpenThreads库的Condition,需要依赖Mutex才能运行。条件没达到时,调用Condition的wait函数,去等待条件。条件达到时,调用Condition的signal放行一个线程,或者broadcast放行所有线程。Condition使用下面程序,表示A,B,C三个售票员分别

snail_hunan的专栏 2934

51单片机+DS18B20+数码管显示+超温提示+Proteus仿真

51单片机+DS18B20+数码管显示+超温提示+Proteus仿真 Proteus仿真 实例代码 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit we1 = P3^0; sbit we2 = P3^1; sbit we3 = P3^2; sbit we4 = P3^3; sbit DS = P1^0; sbit D1 = P3^6; sbit D2 = P3^7; uch

perseverance51博客 1540

OpenThreads库介绍——Block

1. 简介 Block 是OpenThreads中的阻塞器类。顾名思义,这个类的作用就是阻塞线程的执行,使用block()阻塞执行它的线程(注意,不一定是定义它的Thread 线程,而是当前执行了block 函数的线程,包括系统主进程),并使用release()释放之前被阻塞的线程。 2. 实现 OpenThreads库中的Block文件中包括两个类的实现:Block和Block...

Frank的专栏 4200

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

Rockyoung 3325

19. SAP UI5 应用开发教程之十九 - SAP UI5 数据类型和复杂的数据绑定

通过本教程前面的步骤SAP UI5 初学者教程之十七 - 聚合绑定在 UI5 复合控件中的使用的介绍,我们已经学会了如何在 SAP UI5 里显示列表,如下图所示: 本步骤我们给该列表添加更多的业务数据,比如每张发票的金额。 按照本文的步骤完成的 SAP UI5 应用,列表如下图所示: 可以看到,同前一个步骤相比,现在 Invoices 表格里,每张发票的金额和货币单位已经显示出来了。 为了实现这个效果,本步骤的源代码位于我的 Github 这个文件夹下面: https://github.com/wan

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3692

【开源库学习】OpenThreads

项目地址 Github:https://github.com/tibogens/OpenThreads 码云:https://gitee.com/lukeson/OpenThreads 参考资料 网上已经有很多比较好的文章了,这里汇总一下,便于查阅。 OpenThreads库介绍——Condition OpenThreads库介绍——Barrier OpenThreads库介绍——Block OpenThreads库介绍——ReadWriteMutex OpenThreads库介绍——Mutex ..

撬动未来的支点的专栏 509

4D毫米波雷达:高度信息与微多普勒效应

4D毫米波雷达:高度信息与微多普勒效应​ ,人工智能,计算机视觉,大模型,AI,本文深入解析4D毫米波雷达的高度信息获取与微多普勒效应。4D毫米波雷达通过MIMO技术、垂直天线布局及相位差计算等获取高度信息,相较传统雷达更精准。微多普勒效应由目标微运动引发,可用于目标识别、分类和运动监测。文中结合自动驾驶、安防监控案例,分析技术挑战与未来趋势,如信号干扰、数据处理复杂,未来将向高精度、与其他传感器融合发展,展现出在多领域的巨大应用潜力。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 9万+

OpenThreads::Condition

【代码】OpenThreads::Condition。

xiaoyao_zhang的博客 220

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

调试最长的一帧(第11天)

这一天,与流程无关,是多线程库OpenThreads,第三天已经分析过了,本质上就是windows核心编程中的事件,临界区和信号量,存储区和构造时加锁,析构时解锁的类。 再看看这个库是怎么封装的。 抄抄。 1,Thread类,线程实现类。它是一个面向对象的线程实现接口,每定义一个Thread类,就相当于 ...

coder 300

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

探索未知种族之osg类生物---呼吸分解之更新循环一

上节总结 前几天我们大体上介绍完成了osg的事件循环的介绍,总结一下osg的时间循环主要就是得到平台(windows)的所有消息,并遍历所有的node的eventCallback,并对他们进行处理。接下来我们就要进入osg的另一个维持生命的循环---更新循环。 更新循环 OSG 更新循环的作用与事件回调有类似之处:由专门的访问器对象_updateVisitor 的负 责场景图形更新遍历;...

u014177758的博客 354

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OpenThreads线程管理

OpenSceneGraph中线程(OpenThreads)的作用多种多样,涉及到信号量机制,同步异步锁等多种知识点。 OpenThreads: Threads:创建线程,类似于windows中的_beginthread, Mutex :创建互斥,类似于windows中的CreateMutex,用于针对多个线程访问同一资源 情况。 Condition:创建条件,

你安好便晴天的博客 1612

OSG OpenThreads 线程学习(1)

这些天,经过对OSG OpenThreads代码的学习,在

580 2621

OpenThreads解读

HandleHolder 类: 这个类封装了HANDLE 句柄。实现了一些对句柄的操作的函数,比如赋值、获取、关闭句柄等等。 Mutex类: 使用的是临界区进行资源的管理。 使用了Win32MutexPrivateData (在Windows系统中)这个类对临界区 CRITICAL_SECTION 进行封装,然后在Mutex 这个类中保存了一个Win32MutexPrivateData 的成员对象...

封狼居胥 1012

《OSG3.4.0》Part2 OSG中的多线程

OSG多线程简介

梁的博客 4156
上一篇: OpenThreads库介绍——ReadWriteMutex
下一篇: OpenThreads库介绍——Block
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值