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

十、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); // 线程1

	HANDLE t2 = (HANDLE)_beginthread(&sell2Ticket, 0, 0); // 线程2

	iMutex = (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线程开发大体上分为这几类;

相关文章:

  • DeepSeek在初创企业、教育和数字营销领域应用思考
  • Linux:文件(三)
  • Unity 脚本控制3D人物模型的BlendShape
  • 【Java并发】CAS原理
  • 如何恢复苹果手机置出厂设置
  • nvidia-docker2 和 NVIDIA Container Toolkit 的区别及推荐
  • 近10年气象分析(深度学习)
  • 黑马点评 面试话术
  • DeepSeek等LLM对网络安全行业的影响
  • 开源嵌入式实时操作系统uC/OS-II介绍
  • stm32mp采用spi接口扩展can
  • JavaScript基础
  • “国补”带火手机换新,出售旧手机应如何保护个人信息安全
  • 基于跨学科任务图谱和大模型微调的智能体设计
  • 【云上探索实验室】定义开发新范式 —— Amazon Q Developer 的极简开发工坊
  • Redission可重试、超时续约的实现原理(源码分析)
  • 如何在望获实时 Linux 京博航友善 NanoPC-T6 上部署 Docker
  • 深入解析与操作:基于C++的PE文件处理技术揭秘
  • Docker部署中SQLite数据库同步问题解析
  • 备忘录模式:快速恢复原始数据
  • 在线crm什么软件好/东莞seo外包公司
  • 做网站推广选哪家/百度官方版
  • 网站开发工程师asp考试试题/品牌宣传推广文案
  • 网站建设公司做销售好不好?/安阳企业网站优化外包
  • 石家庄商城网站建设/深圳网络推广培训学校
  • adobe 网站制作软件有哪些/谷歌竞价广告