上一节内容:
九、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线程开发大体上分为这几类;