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下编译通过。

使用cubeMX生成USB HID设备

本文主要介绍如何使用stm32开发板和cubeMX生成HID设备,供参考。

专注音频,高效工作,快乐生活! 970

OpenThreads库学习

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

weixin_30905981的博客 698

超越PSPNet:PPM模块在医疗影像分割中的创新应用实验

本文探讨了PPM模块在医疗影像分割中的创新应用,通过定制化调整和优化策略显著提升分割精度。针对医疗影像的多尺度病灶特点,提出了动态尺度选择和交叉尺度融合模块(CSFM),结合PyTorch实现细节,使小病灶检测召回率提升11.3%。实验显示优化后的模型mIoU达到78.6%,较基线提升9.2个百分点,同时满足实时处理需求。

u9v0w的博客 219

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

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

cgprofessional的博客 833

EPLAN中3D宏文件的创建与优化技巧(以开关电源为例)

本文以开关电源为例,详细讲解了在EPLAN中创建和优化3D宏文件(.ema)的全流程。从搭建宏项目、导入模型,到精确定义安装面、调整视野方向,再到定义3D连接点并关联部件库,旨在帮助电气工程师在设计阶段实现精准布局、避免安装冲突,从而提升设计效率与质量。

weixin_29219539的博客 547

MedicalNet实战:3D医疗影像分割从零到部署(PyTorch+ResNet50)

本文详细介绍了基于PyTorch和MedicalNet预训练模型进行3D医疗影像分割的完整实战流程。通过加载ResNet50预训练权重进行迁移学习,大幅降低了对标注数据量的需求,并提升了模型性能。文章涵盖了从数据准备、模型微调、训练优化到最终部署的每一步,为医疗AI开发者提供了从零到部署的清晰指南。

weixin_29062671的博客 588

OpenThreads库的使用-Condition

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

snail_hunan的专栏 2934

第零章 序 Chisel教程汇总

笔者目前西安交通大学微电子硕士在读,研究方向为数字集成电路设计与体系结构。鉴于目前RISC-V的火热程度,笔者参与了课题组的RISC-V项目,并了解、学习了颇受关注的新型硬件构建语言——Chisel,当前参与的神经网络加速器设计便是使用Chisel开发的。这是一门敏捷开发语言,据称要比传统的Verilog语言快很多。在亲身使用过后,笔者发现确实快了不少。这主要得益于Scala作为高级语言的简洁风格...

qq_34291505的博客 7万+

OpenThreads库介绍——Block

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

Frank的专栏 4200

2025年华为杯中国研究生数学建模竞赛E题 高速列车轴承智能故障诊断问题 思路+代码

all_data, file_info = preprocessor.load_mat_files(file_list[:50]) # 加载前50个文件作为示例。[y_source, y_source, domain_labels], # 注意:这里使用伪标签。X_target = np.random.randn(100, X_source.shape[1], 1) # 示例数据。"""构建CNN-Transformer混合模型""""""构建Transformer模型"""

YOLO 1046

【JDK】win 10 / win 11:jdk 8 下载、安装、配置、验证

win10 / win 11:JDK 最新版本下载 / 历史版本下载(jdk 8)、安装、配置系统环境变量、验证安装全详细操作教程

顾三殇 —— 博客空间(软件测试) 13万+

【开源库学习】OpenThreads

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

撬动未来的支点的专栏 509

YOLOv11改进,YOLOv11添加ASFF检测头,并添加小目标检测层(四头检测),适合目标检测、分割等任务,全网首发

YOLOv11改进,YOLOv11添加ASFF检测头,并添加小目标检测层(四头检测),适合目标检测、分割等任务,全网首发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4735

OpenThreads::Condition

【代码】OpenThreads::Condition。

xiaoyao_zhang的博客 220

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

coder 300

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

u014177758的博客 354

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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、付费专栏及课程。

余额充值