十、OSG学习笔记-多线程(OpenThreads)

上一节内容:

九、OSG学习笔记-NodeVisitor节点遍历器-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145742756?spm=1001.2014.3001.5501

本章节代码:

OsgStudy/Openthreads · CuiQingCheng/OsgStudy - 码云 - 开源中国https://gitee.com/cuiqingcheng/osg-study/tree/master/OsgStudy/Openthreads

OSG显示渲染的原理:

渲染管线示例图如下:

Osg,最小的程序:

int main()
{osgViewer::Viewer viewer;viewer.setSceneData(osgDB::readNodeFile("glider.osg"));return viewer.run();
}

其中 osgViewer的派生关系如下图:

在整个viewer中最根部的基类中,osg::Referenced,其中有涉及OpenThreads的使用,其是通过C++实现了,一个隔离底层的线程管理接口,具有四种特性(线程安全, 互斥, 可以顺序执行,可以条件执行)

一、对比windows下创建线程,与OSG创建线程

widndows下:

#include<process.h> // windows, 中创建线程
#include<windows.h>
#include<iostream>// windows 下创建线程
int tickets = 10;HANDLE iMutex; // 互斥void  sellTicket(void* ptr)
{while (tickets > 0){WaitForSingleObject(iMutex, INFINITE); // 等待信号量Sleep(10);std::cout << "Thread1 sell:" << tickets << std::endl;tickets--;ReleaseMutex(iMutex); // 释放互斥}
}void  sell2Ticket(void* ptr)
{while (tickets > 0){WaitForSingleObject(iMutex, INFINITE);Sleep(10);std::cout << "Thread2 sell:" << tickets << std::endl;tickets--;ReleaseMutex(iMutex);}
}int main()
{HANDLE t1 = (HANDLE)_beginthread(&sellTicket, 0, 0); // 线程1HANDLE t2 = (HANDLE)_beginthread(&sell2Ticket, 0, 0); // 线程2iMutex = (HANDLE)CreateMutex(0, FALSE, 0); // 创建互斥,第二个参数,表示,当前创建线程的这个主线程是没有这个信号量的;Sleep(2000);// 等待两个线程执行完return 0;
}

执行结果:

Osg种创建线程:

#include<process.h> // windows, 中创建线程
#include<windows.h>
#include<iostream>#include<OpenThreads/Thread>
#include<OpenThreads/Mutex> // 互斥
#include <OpenThreads/ScopedLock>
#include <OpenThreads/Barrier> // 顺序执行OpenThreads::Mutex opMutex;
OpenThreads::Barrier bar;class ThreadSelf:public OpenThreads::Thread
{
public:ThreadSelf(int a) { m_threadid = a; }~ThreadSelf() override{while (isRunning()) // 判断是否还在运行{OpenThreads::Thread::YieldCurrentThread(); // 释放当前线程}}void run() override{//OpenThreads::ScopedLock<OpenThreads::Mutex> lock(opMutex); // 这里跟bar,不能同时用否则就会卡死在第一个线程中int count = 10;while (count--){Sleep(10);std::cout << "Thread print:" << m_threadid << std::endl;}bar.block(3);}private:int m_threadid;
};int main()
{ThreadSelf t1(10);ThreadSelf t2(5);t1.start();t2.start();bar.block(3); // 参数表面,要等待三个线程执行完,主线程自身执行到这里以及跟两个子线程,执行到完std::cout << "Here" << std::endl;Sleep(3000);return 0;
}

执行结果如图:

Osg 中线程条件控制执行:

代码如下:

#include<process.h> // windows, 中创建线程
#include<windows.h>
#include<iostream>#include<OpenThreads/Thread>
#include<OpenThreads/Mutex> // 互斥
#include <OpenThreads/Condition> // 条件执行int condition = 0;OpenThreads::Condition cond;OpenThreads::Mutex mutex;void setCondition(void* ptr)
{condition = 1;cond.signal();
}void ifCondition(void* ptr)
{cond.wait(&mutex, INFINITE);if (condition){std::cout << "Condition is find" << std::endl;}
}int main()
{HANDLE t1 = (HANDLE)_beginthread(&ifCondition, 0, 0);Sleep(1000);HANDLE t2 = (HANDLE)_beginthread(&setCondition, 0, 0);Sleep(1000);std::cout << "process end" << std::endl;return 0;
}

代码执行结果如下:

OSG线程开发大体上分为这几类;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22891.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI颠覆蛋白质工程:ProMEP零样本预测突变效应

概述 在生命科学的“造物革命”中&#xff0c;蛋白质工程一直面临着“试错成本”与“设计效率”的双重挑战——传统方法依赖繁复的多序列比对&#xff08;MSA&#xff09;或耗时的实验室筛选&#xff0c;如同在浩瀚的蛋白质宇宙中盲选星辰。而今日&#xff0c;一项发表于《Cel…

计算机领域里注重实战的9本书

计算机领域注重实战的书籍众多&#xff0c;以下是一些备受推崇的注重实战的计算机书籍&#xff1a; 1、Redis实战 当你需要以接近实时的速度访问快速变动的数据流时&#xff0c;Redis这样的键值数据库就是你的极好选择。通过接纳散列、字符串、列表等多种数据类型&#xff0c;…

《2024工业控制系统网络安全态势白皮书》

一、白皮书发布背景 东北大学“谛听”网络安全团队近日撰写并发布了2024年工业控制网络安全态势白皮书&#xff0c;读者可以通过报告了解2024年工控安全相关政策法规报告及典型工控安全事件分析。 二、白皮书主要内容 报告对工控系统漏洞、联网工控设备、工控蜜罐与威胁情报…

【VSCode】MicroPython环境配置

【VSCode】MicroPython环境配置 RT-Thread MicroPython 插件安装MicroPython 库文件配置结束语 RT-Thread MicroPython 插件安装 在 VSCode 拓展中搜索 “RT-Thread MicroPython” 并安装&#xff0c;详细配置步骤&#xff08;修改 VSCode 默认终端、MicroPython 代码补全&…

如何在VMware虚拟机的window10系统中安装网易mumu模拟器

安卓模拟器是可以在电脑的windows环境中运行手机软件的工具,喜欢网游或者是要逆向安卓应用应该都要安装这个模拟器,如果要模拟器正常工作,主机的虚拟化应该开启,也就是要开启vt。在有些情况下,需要把模拟器安装到电脑的虚拟机里,隔离模拟器与主机,这时vt的开启就稍麻烦些…

Mac本地部署DeepSeek-r1

一、安装DeepSeek 1.1 安装ollama模型管理器 ollama官网下载安装包&#xff1a;https://ollama.com/ 看到mac右上方工具图标出现小羊驼&#xff0c;表示ollama已经安装成功。 2.2 安装DeepSeek 打开终端&#xff0c;输入命令&#xff1a;ollama run deepseek-r1:1.5b&…

单页图床HTML源码+本地API接口图床系统修复版源码

源码介绍 图床系统是一种用于存储和管理图片文件的在线服务。它允许用户上传图片文件&#xff0c;并生成相应的图片链接&#xff0c;从而方便用户在网页、社交媒体或其他平台上分享图片。 PS:源码压缩包分为两个版本&#xff0c;一个是调用360第三方api接口&#xff0c;另外一…

初级渗透测试工程师需要学什么?网络安全零基础入门到精通教程建议收藏!

1、前言 本文主要介绍如何成为一名初级的渗透测试工程师所需要学习的内容&#xff0c;后续也会基于此将自己的学习总结、心得记录下来。相信在不断坚持下&#xff0c;争取在今年五月初成为一名初级的渗透测试工程师。 2、涉及知识领域 基础网络知识&#xff1a; 理解TCP/IP协…

DeepSeek写俄罗斯方块手机小游戏

DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件&#xff1a; 核心功能要求 原生JavaScript实现&#xff0c;适配手机屏幕 …

网络安全营运周报

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 第三章网络安全基础 一、网络安全概述 1、网络安全现状及安全挑战 网络安全范畴极其广泛&#xff0c;可以说是涉及多方面。 因为计算机病毒层出不穷以及黑客的…

C#中级教程(1)——解锁 C# 编程的调试与错误处理秘籍

一、认识错误&#xff1a;编程路上的 “绊脚石” 在 C# 编程中&#xff0c;错误大致可分为两类&#xff1a;语法错误和语义错误&#xff08;逻辑错误&#xff09;。语法错误就像是写作文时的错别字和病句&#xff0c;编译器一眼就能识别出来&#xff0c;比如变量名拼写错误、符…

QML Button 部件的使用

按钮也是程序开发中最经常用到的部件&#xff0c;当然其也是比较简单&#xff0c;只需要懂得最基本的操作即可&#xff1b; Button {id: btnwidth: 100height: 50 } 生成一个最基本的按钮 text 属性可以设置按钮文本&#xff1b; flat 属性设置为true时&#xff0c;只有鼠标…

Starlink卫星动力学系统仿真建模第七讲-卫星姿轨控系统(Attitude and Orbit Control System, AOCS)设计规范

以下是一份卫星姿轨控系统&#xff08;Attitude and Orbit Control System, AOCS&#xff09;设计规范的框架和核心内容示例&#xff0c;供参考&#xff1a; 卫星姿轨控系统&#xff08;AOCS&#xff09;设计规范 1. 总则 1.1 目的 本规范旨在规定卫星姿轨控系统的设计要求、…

DINOv2 + yolov8 + opencv 检测卡车的可拉拽雨覆是否完全覆盖

最近是接了一个需求咨询图像处理类的&#xff0c;甲方要在卡车过磅的地方装一个摄像头用检测卡车的车斗雨覆是否完全&#xff0c; 让我大致理了下需求并对技术核心做下预研究 开发一套图像处理软件&#xff0c;能够实时监控经过的卡车并判断其车斗的雨覆状态。 系统需具备以下…

基础dp——动态规划

目录 一、什么是动态规划&#xff1f; 二、动态规划的使用步骤 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 三、试题讲解 1.最小花费爬楼梯 2.下降路径最小和 3.解码方法 一、什么是动态规划&#xff1f; 动态规划&#xff08;Dynamic Programming&…

Java+Vue+SpringBoot+数据可视化的小吃摊位管理平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在繁华的美食街区&#xff0c;美食摊位星罗棋布&#xff0c;每天都上演着热闹非凡的烟火…

链表-基础训练(二)链表 day14

两两交换链表中的节点 题目示意&#xff1a; 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 原先我的思路是图像上的思路&#xff0c;但是我感觉还是很复杂…

进程概念、PCB及进程查看

文章目录 一.进程的概念进程控制块&#xff08;PCB&#xff09; 二.进程查看通过指令查看进程通过proc目录查看进程的cwd和exe获取进程pid和ppid通过fork()创建子进程 一.进程的概念 进程是一个运行起来的程序&#xff0c;而程序是存放在磁盘的&#xff0c;cpu要想执行程序的指…

极客大学 java 进阶训练营怎么样,图文详解

Spring 思维导图 Spring 源码学习笔记 有关微服务的面试题&#xff1a; Dubbo中zookeeper做注册中心&#xff0c;如果注册中心集群都挂掉&#xff0c;发布者和订阅者之间还能通信么&#xff1f;微服务学习笔记 有关分布式的面试题&#xff1a; 消息幂等:如何保证消息不被重复…

如何手动设置u-boot的以太网的IP地址、子网掩码、网关信息、TFTP的服务器地址,并进行测试

设置IP地址 运行下面这条命令设置u-boot的以太网的IP地址&#xff1a; setenv ipaddr 192.168.5.9设置子网掩码 运行下面这条命令设置u-boot的以太网的子网掩码&#xff1a; setenv netmask 255.255.255.0设置网关信息 运行下面这条命令设置u-boot的网关信息&#xff1a; …