OpenThreads库介绍——Block

OSG场景的多线程渲染,基本场景渲染过程——b站72讲17讲+书籍 osg72讲 阅读详情

1. 简介


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

2. 实现


OpenThreads库中的Block文件中包括两个类的实现:Block和BlockCount,后者添加了一个计数器,控制多次操作之后释放阻塞的线程。 它与阻塞器类的使用方法基本相同:block()阻塞线程,release()释放线程;不过除此之外,BlockCount 的构造函数还可以设置一个阻塞计数值。计数的作用是:每当阻塞器对象的completed()函数被执行一次,计数器就减一,直至减到零
就释放被阻塞的线程。

2.1 Block

Block类是使用OpenThreads中的Condition来实现的,在传统的线程概念(比如C++11中)并没有一个与之对应的类,Block的成员中包括

        Mutex _mut;
        Condition _cond;
        bool _released;

在Block的Block方法实现如下:

        inline bool block()
        {
            ScopedLock<OpenThreads::Mutex> mutlock(_mut);
            if( !_released )
            {
                return _cond.wait(&_mut)==0;
            }
            else
            {
                return true;
            }
        }

可以看到它是通过一个Condition来阻塞运行这个函数的线程,并等待其他线程唤醒这个运行它的线程。唤醒的操作在release函数中实现:

        inline void release()
        {
            ScopedLock<OpenThreads::Mutex> mutlock(_mut);
            if (!_released)
            {
                _released = true;
                _cond.broadcast();
            }
        }

这里使用的是Condition中的broadcast方法(没有使用signal),也就是同时释放多个阻塞的线程。

由此可以知道这个类的使用方式:在A线程中调用它的block方法,导致A线程被阻塞。然后在B线程中调用它的release方法,释放被阻塞的A线程。(也可以在多个线程中调用block方法,导致多个线程被阻塞,然后B线程可以调用release方法一次性释放多个被阻塞的线程)

2.2 BlockCount

它的block和release实现和Block完全几乎一样,但是它里面有一个计数器,实现如下:

        inline void block()
        {
            OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut);
            if (_currentCount)
                _cond.wait(&_mut);
        }

如果_currentCount是0,那么不会进入阻塞。

        inline void release()
        {
            OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut);
            if (_currentCount)
            {
                _currentCount = 0;
                _cond.broadcast();
            }
        }

在realse中同样是会根据_currentCount值来释放所有的线程。假设想使用一个BlockCount来实现和Block一样的功能,那么必须这样做:

//首先声明一个BlockCount
BlockCount bc;
//设置它的Count不是0,设置任何非零的正整数都可以
bc.setBlockCount(1);
//然后就可以和Block一样在一个线程中调用阻塞它
bc.block();
//另一个线程中唤醒
bc.release();

除此之外,这个类提供了一个completed的函数,用来递减技术,当计数为0,释放被阻塞的线程

        inline void completed()
        {
            OpenThreads::ScopedLock<OpenThreads::Mutex> mutlock(_mut);
            if (_currentCount>0)
            {
                --_currentCount;

                if (_currentCount==0)
                {
                    // osg::notify(osg::NOTICE)<<"Released"<<std::endl;
                    _cond.broadcast();
                }
            }
        }

也就是这个类可以让释放被阻塞线程的那个线程(上文示例中的B线程)可以有一个计数器,通过这个计数器到0,决定释放所有其他线程。

3. 示例


#include <OpenThreads/Thread>
#include <OpenThreads/Condition>
#include <OpenThreads/Mutex>
#include <OpenThreads/ScopedLock>
#include <OpenThreads/Block>
#include <iostream>



class TestThread : public OpenThreads::Thread
{
public:
    TestThread() : _done(false), _count(0){ }
    ~TestThread() {  cancel();  }

    void block(){ _block.block(); }

    virtual int cancel()
    {
        _block.release();
        _done = true;
        while (isRunning())
        {
            OpenThreads::Thread::YieldCurrentThread();
        }
        return 0;
    }

    virtual void run()
    {
        do 
        {
            std::cout << "(" << _count << ")";
            ++_count;

            if (_count == 10)
            {
                _block.release();
                _block.reset();
                _block.block();
            }
            microSleep(150000);

        } while (!_done);
    }



protected:
    bool                    _done;
    unsigned long       _count;
    OpenThreads::Block  _block;
};



int main()
{
    TestThread t;
    t.start();
    t.block();
    std::cout << "(Main)" << std::endl;
    getchar();
    t.cancel();

    return 0;
}

运行程序的结果:

Thread

可以发现,Block::block()函数将首先阻塞主进程,被释放后再次阻塞的是TestThread 线程,这与它是谁的成员变量并无关系。

OpenThreads库API手册(osg3.6.0) 自己编译的OpenThreads手册,chm格式的,欢迎下载。(该资源只有OpenThreads API,不包含OSG,如果需要OSG请搜索我的其他资源) 立即下载

相关推荐

OpenThreads-开源

该库旨在为 C++ 程序员提供最小且完整的面向对象 (OO) 线程接口。 它以 Java 线程 API 和 POSIX 线程标准为松散模型。 图书馆的架构是围绕\

OpenThreads之block使用

对于Block类的使用,需要在两个线程中配合使用:1.线程1 中 调用block,进入等待,2. 线程2 中调用release 进行释放 3.同时必须在 线程1执行block结束,或线程2 release结束后,调用reset ,重置阻塞器状态。实例代码如下:#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;sstream...

kasteluo的专栏 3566

osgb转3mx工具 很实用的工具

osgb转3mx工具 很实用的工具

OpenThreads线程库

OpenThreads与pthread不同点在于,他是根据面向对象开发的。 一、OpenThreads在线程同步上不同于之前我所了解的(比如pthread),除了常用的几路,他还提出了额外的。 传统的: 1. 互斥量OpenThreads::Mutex类 当线程使用某一资源时,先使用互斥量加锁。由于采用了面向对象机制将互斥量抽象为一个类,所以不像pthread函数那样传入个参数。Mutex

4469

ROS2仿真抓取分拣案例,使用myCobot 280机械臂结合ROS2系统搭建机械分拣站

本案例展示了如何利用myCobot 280 urdf模型构建一个对象分类站,并在ROS2 jazzy中完成运动规划。

m0_71627844的博客 2125

Oracle登录报错ORA-12560?5分钟搞定TNS协议适配器错误的完整修复指南

本文详细解析了Oracle登录报错ORA-12560(TNS协议适配器错误)的成因与解决方案。从基础服务检查到高级网络配置排查,提供了一套完整的修复流程,帮助数据库管理员快速解决连接问题,确保Oracle数据库的稳定运行。

weixin_29278805的博客 521

OpenThreads库介绍——Thread

OpenThreads库是一个轻量级的跨平台多线程库,在2.x之前是独立发展的一个库,在2.x后并入到OSG的源码中,OSG中大量的多线程操作都是基于这个库编写的。(事实上使用该库是历史原因的问题,在OSG创立的时候,C++标准中并没有C++11引入的线程库),库的详细介绍参考:OpenThreads站点 Thread线程 线程实现类。它是一个面向对象的线程实现接口,每定义一个Thread...

Frank的专栏 7259

浙大数值分析lab2

最可怕的一道题,题目是这样的 Root of a Polynomial A polynomial of degree nnn has the common form as p(x)=cnxn+cn−1xn−1+⋯+c1x+c0p(x)=c_n x^n + c_{n-1} x^{n-1} + \cdots + c_1 x + c_0p(x)=c​n​​x​n​​+c​n−1​​x​

yao_zou的博客 4797

OpenThreads库学习

在看STM32资料中看到STM32WB系列“双核无线微控制器配备双核无线微控制器(MCU)配备Bluetooth® 5、OpenThread和ZigBee®3.0连接技术,同时兼备超低功耗性能“不知道这个OpenThread是啥东东: OpenThread库:提供了一个Thread类,供用户创建自己的线程。其使用非常方便,用户只需要继承自OpenThreads::Thread类,#in...

weixin_30905981的博客 698

STC8H单片机ADC实战:从读取电位器到串口绘图,12位精度玩起来

本文详细介绍了STC8H单片机的ADC功能实战应用,从读取电位器到串口绘图,展示了12位精度的实现方法。通过硬件连接、代码配置、串口数据传输及高级优化技巧,帮助开发者快速掌握ADC模块的使用,适用于各种传感器数据采集和信号处理场景。

weixin_28278377的博客 344

【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞

【代码】【RL+空战】学习记录01:jsbsim 仿真环境初次学习,F16 战机起飞。

weixin_41369892的博客 902

【开源库学习】OpenThreads

项目地址 Github:https://github.com/tibogens/OpenThreads 码云:https://gitee.com/lukeson/OpenThreads 参考资料 网上已经有很多比较好的文章了,这里汇总一下,便于查阅。 OpenThreads库介绍——Condition OpenThreads库介绍——Barrier OpenThreads库介绍——Block OpenThreads库介绍——ReadWriteMutex OpenThreads库介绍——Mutex ..

撬动未来的支点的专栏 509

RV1126 ISP开发实战:从Tuner调试到IQ文件解析

本文详细介绍了RV1126 ISP开发的完整流程,从Tuner调试到IQ文件解析,涵盖了环境搭建、工具使用、参数配置及性能优化等关键环节。通过实战案例和避坑指南,帮助开发者快速掌握Rockchip芯片的ISP开发技巧,提升图像处理质量。

weixin_29195615的博客 572

调试最长的一帧(第11天)

这一天,与流程无关,是多线程库OpenThreads,第三天已经分析过了,本质上就是windows核心编程中的事件,临界区和信号量,存储区和构造时加锁,析构时解锁的类。 再看看这个库是怎么封装的。 抄抄。 1,Thread类,线程实现类。它是一个面向对象的线程实现接口,每定义一个Thread类,就相当于 ...

coder 300

PrimeTime low power-SMVA分析(4)

这些功能只有在将timing_enable_cross_voltage_domain_analysis变量设置为true时才能使用。DVFS场景与在分布式多场景分析(DMSA)中分析的运行条件场景无关。- check_timing 和 report_exceptions 命令通过将检查或报告应用于所有可能的场景和电压组合来支持SMVA。- 相位锁定环生成的时钟(create_generated_clock -pll_feedback 和 -pll_output)在多个场景的情况下,返回最差情况的值。

QRBQ 649

手把手入门YOLO到改进优化教程 | 【P1基础篇】YOLOv8网络架构原理

本节先来学习基础知识,以YOLOv8进行讲解入门, 拿YOLOv8入手掌握YOLO的底层逻辑 ,也可以基于此来轻松学习后面更新的YOLO系列 (大部分YOLO版本的核心思想一致,更新是基于旧版本做结构升级、优化策略,学习成本会越来越低)。

嵌入式阿齐Archie 2万+

OpenThreads使用-Block

Block简介Block,障碍物,阻塞。 通过Block对线程进行阻塞,然后释放障碍物,使得线程继续运行。Block使用Block的使用,通过调用block函数,阻塞调用线程。然后通过release函数,释放所有被这个Block阻塞的线程。 下面这个程序,开启A,B线程,去售票,然后主线程自己阻塞。当A卖完10张票以后,释放Block,主线程继续运行,去开启C线程售票。同时A阻塞自己,停止售票。

snail_hunan的专栏 1032

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

OpenThreads::Block

/让当前线程主动让出 CPU 时间片。//微秒(百万分之一秒)//block()阻塞执行它的线程(不一定是定义它的线程)

xiaoyao_zhang的博客 342

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OpenThreads使用-BlockCount

BlockCount简介BlockCount,障碍物个数。 之前通过一个Block可以阻塞线程。但是当一个线程,需要多个条件都满足时,才能继续运行。这怎么办呢?这个BlockCount就是用来干这个的。BlockCount使用BlockCount的使用,和Block类似。阻塞线程,使用block函数。释放线程,使用release函数。但是比Block多出来的功能是,使用completed函数,表示

snail_hunan的专栏 1157

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

OpenThreads线程管理

HandleHolder 类: 这个类封装了HANDLE 句柄。实现了一些对句柄的操作的函数,比如赋值、获取、关闭句柄等等。 Mutex类: 使用的是临界区进行资源的管理。 使用了Win32MutexPrivateData (在Windows系统中)这个类对临界区 CRITICAL_SECTION 进行封装,然后在Mutex 这个类中保存了一个Win32MutexPrivateData 的成员对...

a_Treasure的博客 515

OpenThreads解读

HandleHolder 类: 这个类封装了HANDLE 句柄。实现了一些对句柄的操作的函数,比如赋值、获取、关闭句柄等等。 Mutex类: 使用的是临界区进行资源的管理。 使用了Win32MutexPrivateData (在Windows系统中)这个类对临界区 CRITICAL_SECTION 进行封装,然后在Mutex 这个类中保存了一个Win32MutexPrivateData 的成员对象...

封狼居胥 1012

osg自学笔记4——《最长的一帧》第11日

第四日 具体内容 调用结构 总结 解读成果: osg::DisplaySettings::setDefaults, osg::GraphicsContext::createGraphicsContext, osgViewer::View:: setUpViewInWindow。 悬疑列表: 类变量_cameraWithFocus 的意义是什么? ViewConfig类的子类有: AcrossAllScreens类 SingleScreen类 SingleWindow类 这里的调用和继承我感觉有些不

jean7155的专栏 209

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

OSG多线程简介

梁的博客 4156

【OSG原理与源码分析】OSG多线程模块:OpenThreads之C++跨平台多线程编程库那点事

简介本文将介绍跨平台多线程库的设计方案,还将介绍开源三维图形框架OSG(Open Scene Graph)中的跨平台多线程库OpenThreads的初步理解的一些基础知识。

cgprofessional的博客 833

OpenThreads库的使用-Mutex

Mutex是什么Mutex,叫互斥锁。 在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为” 互斥锁” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。为什么使用Mutex因为线程存在并发性,并发容易导致问题。举个例子:A,B两个售票员,看到最后还有一张车票。同时,正好有C,D两个人要买这张车票。那么这个车票怎么卖?A认为可以卖给C,B认为可以卖

snail_hunan的专栏 2273

OpenThreads库介绍——ReadWriteMutex

1. 读写锁简介 OpenThreads库中的ReadWriteMutex是一种读写锁,读写锁是计算机程序的并发控制的一种同步机制,也称“共享-互斥锁”、多读者-单写者锁。多读者锁,用于解决读写问题。读操作可并发重入,写操作是互斥的。简单来说就是允许多个线程同时读取资源,但是一旦要修改资源(写操作),那么所有读的线程都必须被阻塞,直到写的线程完成修改。 2. 类型 读写锁可以根据实际的需...

Frank的专栏 919
上一篇: OpenThreads库介绍——Condition
下一篇: OpenThreads库介绍——Barrier
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值