《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)
...
}
在大括号范围内,进程的共享资源被当前进程锁定,超过范围则自动解锁。