OpenThreads线程库

OpenThreads是一个基于面向对象开发的线程库,它提供了与pthread不同的同步机制。除了互斥量、条件量和阻塞器,OpenThreads还引入了计数阻塞器和栅栏类。计数阻塞器允许线程在特定计数达到零时自动释放,而栅栏类用于同步多个线程,当所有线程到达屏障点时,它们将同时继续执行。
摘要由CSDN通过智能技术生成

OpenThreads与pthread不同点在于,他是根据面向对象开发的。

一、OpenThreads在线程同步上不同于之前我所了解的(比如pthread),除了常用的几路,他还提出了额外的。

传统的:

1. 互斥量OpenThreads::Mutex类

当线程使用某一资源时,先使用互斥量加锁。由于采用了面向对象机制将互斥量抽象为一个类,所以不像pthread函数那样传入个参数。Mutext有两个函数:

int Mutex::lock()

int Mutex::unlock()

2. 条件量OpenThreads::Condition类

与Mutex配合使用,一直阻塞直到Mutex解锁。

int wait(Mutex* mutex)                         // 阻塞直到mutex解锁

int signal() // 唤醒此线程

int broadcast() // 唤醒所有被阻塞的线程

3. 阻塞器类OpenThreads::Block类

阻塞/释放当前线程。

bool block();

void release();

新看到的:

4. 计数阻塞器OpenThreads::BlockCount类

与Block相似的是也是通过block阻塞线程,通过release释放线程。区别是,BlockCount设置了一个int count。每当BlockCount::completed被执行一次,count减1,减到0时,被阻塞线程自动释放。(注意此时被阻塞线程是阻塞的&

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenThreads 是一个跨平台的C++线程,它可以用于加载和使用模型。以下是一个简单的示例代码,展示如何使用OpenThreads加载模型: ```c++ #include <osg/Node> #include <osgDB/ReadFile> #include <OpenThreads/Thread> #include <OpenThreads/Mutex> osg::Node* model = NULL; OpenThreads::Mutex mutex; class ModelLoaderThread : public OpenThreads::Thread { public: virtual void run() { // 加载模型 osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("model.ive"); // 加锁,确保对全局变量的安全访问 mutex.lock(); // 将模型指针赋值给全局变量 model = loadedModel.get(); // 解锁 mutex.unlock(); } }; int main() { // 创建并启动模型加载线程 ModelLoaderThread modelLoaderThread; modelLoaderThread.startThread(); // 在主线程中等待模型加载完成 while (model == NULL) { OpenThreads::Thread::microSleep(1000); } // 使用模型 // ... return 0; } ``` 在上面的示例中,我们定义了一个 `ModelLoaderThread` 类,它继承自 `OpenThreads::Thread`。在 `run()` 方法中,我们使用 `osgDB::readNodeFile()` 函数加载模型,并将模型指针赋值给全局变量 `model`。 在主函数中,我们创建并启动 `ModelLoaderThread` 线程,并在主线程中循环等待模型加载完成。当模型加载完成后,我们就可以使用全局变量 `model` 来访问模型了。 需要注意的是,在访问全局变量 `model` 时,我们必须先加锁,以确保对它的安全访问。在本示例中,我们使用了 `OpenThreads::Mutex` 类来实现线程同步。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值