《OSG3.4.0》Part2 OSG中的多线程

《OSG3.4.0》Part2 OSG中的多线程

* OSG中的多线程*
OSG中的多线程是通过OpenThreads实现的。主要有七大类:

  • Thread类
  • Mutex类
  • Condition类
  • Block类
  • BlockCount类
  • Barrier类
  • ScopeLock模板类

1、Thread类

Thread() 默认构造函数
static int YieldCurrentThread 要求当前线程出让cpu控制权,交给其他正在等待的线程
int start() 启动线程。此时将自动开始执行线程的run()函数
int startThread() 启动线程。此时将自动开始执行线程的run()函数
int cancel() 虚函数,用于中止线程的执行
bool isRunning() 线程执行的主函数,在这个函数中可以循环执行一段线程功能代码->
void run()=0 ->但一定要用yieldCurrentThread()出让cpu控制权
int setProcessorAffinity(unsigned int cpuNumber) 对于多处理器的系统,设置线程所在的cpu位置

2、 Mutex类

互斥体接口类——可以有效地避免各个线程对同一资源的相互竞争—某个线程欲操作某一共享资源时,使用互斥体成员的lock()函数加锁,操作完成猴再使用unlock()函数解锁。一个线程中可以有多个Mutex成员,用于在不同的地点或情形下为共享区域加锁;但是一定要在适当的线程的共享数据无法再访问。

* openThread::Mutex类*

Mutex() 默认构造函数
int lock() 互斥体加锁/解锁
int unlock() 互斥体加锁/解锁

3、 Condition类

条件量接口类。它依赖于Mutex互斥体,互斥体加锁时阻塞所在的线程,解锁或者超过时限则释放此线程,允许其继续运行。

>线程同步:

简单来说就是使同一进程的多个线程可以协调工作,例如他猛都在指定的执行点等待对方,直到全员到齐之后才开始同步运行。

>线程拥塞:

即强制一个线程在某个执行点上等待,直到满足继续运行的条件为止,例如其他的线程达到同一执行点、某个变量初始化完成等:可以通过条件变量来设置各种条件。

OpenThreas::Condition

Condition() 默认构造函数
int wait(Mutex* mutex) 设置作为条件量的互斥体,并强制线程等待此条件满足
int singal() 唤醒一个线程,或者唤醒所有被阻塞的线程
int broadcast() 唤醒一个线程,或者唤醒所有被阻塞的线程

4、 Block类

即阻塞器类,顾名思义,这个类的作用就是阻塞线程的执行,即使用block()阻塞执行它的线程(注意,不一定是定义它的Thread线程,而是当前执行了block函数的线程,包括系统主进程),并使用release()释放之前被阻塞的线程。

OpenThreas::Block类

Block() 默认构造函数
bool block() 阻塞当前的线程
void release() 释放当前的线程

5、 BlockCount类

即计数阻塞器类。它与阻塞器类的使用方法基本相同:block()阻塞线程,release()释放线程;不过除此之外,BlockCount的构造函数还可以设置一个阻塞计数值。计数的作用是:每当阻塞器对象的complete()函数被执行一次,计数器就减1,直到减到零释放被阻塞的线程。

OpenThreas::BlockCount类

BlockCount(unsigned int count) 构造函数,其中定义了初始计数值
bool block() 直接阻塞当前的线程
void release() 直接释放当前的线程
void complete() 完成一次计数器减1的操作,减到零时释放被阻塞的线程

6、 Barrier类

即线程栅栏类。这是一个对于线程同步来说颇为重要的阻塞器接口,其构造函数与BlockCount类似,可以设置一个整数值,我们可以把这个值理解为栅栏的“强度”。每个执行了Barrier::Block()函数的线程都将被阻塞;当被阻塞在栅栏处的线程达到指定的数目时,就好比栅栏无法无法支撑那么大的强度一样,栅栏被冲开,所有的线程将被释放。重要的是,这些线程几乎是同时释放的,也就保证了线程执行的同步性。

OpenThreas::Barrier类

Barrier(int Threads) 构造函数,其中定义了栅栏可以负荷的线程数
bool block(unsigned int) 阻塞当前的线程,如果超过了栅栏的强度(可以在这里重新设定强度),则自动释放所有的线程

7、 ScopeLock模板类

ScopeLock模板类是与Mutex配合出现的,在其作用区域内将对共享资源进行加锁,作用域之外则自动解锁。代码格式如下:

{
OpenThreads::ScopeLock<OpenThreads::Mutex>lock(_mutex)
...
}

在大括号范围内,进程的共享资源被当前进程锁定,超过范围则自动解锁。

猜你喜欢

转载自blog.csdn.net/sinat_24206709/article/details/78598392