OpenThreads库介绍——Thread

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);

输出

OpenThreads库介绍——Thread_第1张图片

  • 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);
}

输出

OpenThreads库介绍——Thread_第2张图片

可以看到二者的输出不同,join方式中主线程会等待MyThread线程执行完成之后才开始继续执行,关于join和detach可以参考:线程的join 和detach状态(线程的分离与结合)

2. 其他函数

在Thread类中还有两个比较常用的函数,都是静态的函数。

  • static int YieldCurrentThread();
    挂起当前执行的线程

  • static int microSleep(unsigned int microsec);
    使得当前线程进入睡眠

两者可以让当前的线程停止执行,转而让进程处理其他线程的工作。

参考资料

1.线程的join 和detach状态(线程的分离与结合)
2.OpenThreads库的使用-Thread

你可能感兴趣的:(OpenGL和OSG基础)