OpenThreads库是一个轻量级的跨平台多线程库,在2.x之前是独立发展的一个库,在2.x后并入到OSG的源码中,OSG中大量的多线程操作都是基于这个库编写的。(事实上使用该库是历史原因的问题,在OSG创立的时候,C++标准中并没有C++11引入的线程库),库的详细介绍参考:OpenThreads站点
Thread线程
线程实现类。它是一个面向对象的线程实现接口,每定义一个Thread 类,就相当于定义了一个共享进程资源,但是可以独立调度的线程。通过重写run()和cancel()这两个成员函数,即可实现线程运行时和取消时的操作;通过调用start()和cancel(),可以启动或中止已经定义的进程对象。
1. 线程的使用
OpenThread的Thread类是一个纯虚类,需要子类重写run方法,提供线程运行的函数入口地址,例如
class MyThread : public OpenThreads::Thread
{
public:
MyThread(){}
~MyThread(){}
virtual void run()
{
for (int i = 0; i < 10; ++i)
{
std::cout << "My Thread Running" << std::endl;
}
}
};
线程在产生之后,可以使用join和detach到创建它的线程,如果使用join的方式,那么创建它的线程必须等待直到这个线程完成,如果是detach的方式,那么创建线程的线程和被创建的线程二者之间没有任何关系,被创建的线程相当于完全独立出来了。在OpenThread中默认使用的就是detach的模式。
- detach方式
int main()
{
MyThread thread;
thread.start();
for (int i = 0; i < 10; ++i)
{
std::cout << "Main Thread Running" << std::endl;
}
OpenThreads::Thread::microSleep(1500000);
输出
- join方式
int main()
{
MyThread thread;
thread.start();
thread.join();
for (int i = 0; i < 10; ++i)
{
std::cout << "Main Thread Running" << std::endl;
}
OpenThreads::Thread::microSleep(1500000);
}
输出
可以看到二者的输出不同,join方式中主线程会等待MyThread线程执行完成之后才开始继续执行,关于join和detach可以参考:线程的join 和detach状态(线程的分离与结合)
2. 其他函数
在Thread类中还有两个比较常用的函数,都是静态的函数。
static int YieldCurrentThread();
挂起当前执行的线程static int microSleep(unsigned int microsec);
使得当前线程进入睡眠
两者可以让当前的线程停止执行,转而让进程处理其他线程的工作。