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