OpenThreads.ReadWriteMutex是OpenSceneGraph中的读写互斥量,类似于OpenThreads.Mutex,但它允许多个线程同时读取,但只有一个线程可以写入。
OpenThreads.ReadWriteMutex有一个默认构造函数和一个带参数的构造函数。
// 默认构造函数
ReadWriteMutex();
// 带参数的构造函数
ReadWriteMutex(bool useMutexInternally);
如果useMutexInternally参数设置为true,ReadWriteMutex将使用内部实现的OpenThreads.Mutex来实现读取和写入的同步。这通常比使用操作系统提供的读写锁快,但仅适用于OpenThreads库已经初始化的情况。
OpenThreads.ReadWriteMutex具有以下成员函数:
void readLock();
请求读锁,如果其他线程持有写锁,则当前线程将被阻塞。如果其他线程持有读锁,则当前线程将继续执行。
void readUnlock();
释放读锁。
void writeLock();
请求写锁,如果其他线程持有读锁或写锁,则当前线程将被阻塞。如果当前线程持有读锁,则它将被释放。
void writeUnlock();
释放写锁。
void lock();
请求写锁,等同于writeLock()。
void unlock();
释放写锁,等同于writeUnlock()。
bool isReadLocked() const;
返回true,如果当前有一个或多个线程持有读锁。
bool isWriteLocked() const;
返回true,如果当前有一个线程持有写锁。
#include <OpenThreads/ReadWriteMutex>
#include <osg/Vec3d>
OpenThreads::ReadWriteMutex positionMutex;
osg::Vec3d position;
void setNewPosition(const osg::Vec3d& newPos)
{
positionMutex.writeLock();
position = newPos;
positionMutex.writeUnlock();
}
osg::Vec3d getCurrentPosition()
{
positionMutex.readLock();
osg::Vec3d currentPos = position;
positionMutex.readUnlock();
return currentPos;
}