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;
}

运行程序的结果:

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

OpenThreads库介绍——Block相关推荐

  1. Android源码学习(五):AVB2.0-libavb库介绍2

    感谢前辈的blog,安全相关的资料可太少了,很详细很卓越 https://blog.csdn.net/jackone12347/article/details/116241676 上一篇的末尾我们说好 ...

  2. 2021年大数据ELK(三):Lucene全文检索库介绍

    全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.什么是全文检索 1.结构化数据与非结构化数据 2.搜索结构化 ...

  3. 强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例

    强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例 1. 引言 在这个部分补充之前马尔科夫决策和动态规划部分的代码.在以后的内容我会把相关代码都附到相关内容的后面.本部 ...

  4. 实战篇一 python常用模块和库介绍

    # -_-@ coding: utf-8 -_-@ -- Python 常用模块和库介绍 第一部分:json模块介绍 import json 将一个Python数据结构转换为JSON: dict_ = ...

  5. Python进阶11-标准库介绍02

    摘要:Python标准库介绍 Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识. 硬件原理 这一部份需要了解内存,CPU ...

  6. Python进阶10-标准库介绍01

    摘要:Python标准库介绍 Python的一大好处在于它有一套很有用的标准库(standard library).标准库是随着Python一起安装在你的电脑中的,是Python的一部分 (当然也有特 ...

  7. C++的iostream标准库介绍

    C++的iostream标准库介绍 0 为什么需要iostream 1 iostream: istream 和 ostream 2 fstream: ifstream 和 ofstream 3 str ...

  8. 【Alljoyn】 Alljoyn学习笔记七 Alljoyn瘦客户端库介绍

    Alljoyn瘦客户端库介绍(上) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设 ...

  9. python的threading库_python标准库介绍——31 threading 模块详解

    threading 模块 (可选) ``threading`` 模块为线程提供了一个高级接口, 如 [Example 3-1 #eg-3-1] 所示. 它源自 Java 的线程实现. 和低级的 ``t ...

最新文章

  1. 启明云端方案分享| ESP32-S2 摄像头 WIFI方案应用于智能猫眼
  2. 多多自走棋改动_多多自走棋腾讯版
  3. C++17尝鲜:类模板中的模板参数自动推导
  4. 微软CNTK 2.0版本发布,支持C#
  5. 面向对象(OOP)一
  6. AduSkin - UI 追求极致,永臻完美
  7. 【面试题22】栈的压入、弹出序列
  8. Win8Metro(C#)数字图像处理--2.7图像伪彩色
  9. Linux安装GCC方法—简洁版
  10. JAVA入门学习 —数组排序的方法
  11. MAC chrome 谷歌浏览器全屏显示——隐藏菜单栏
  12. 有了这些好看的流程图模板,你也可以画出漂亮的流程图
  13. Jupyter notebook的主题和字体美化
  14. java以及JavaScript的香港身份证验证方法。
  15. uni.showToast与uni.navigateTo同时使用问题
  16. 中国微粉化蜡行业市场供需与战略研究报告
  17. 飞机上允许携带哪些移动电源?
  18. 34 机器学习与人工智能
  19. java计算机毕业设计家教到家平台MyBatis+系统+LW文档+源码+调试部署
  20. LSP“浏览器劫持概念

热门文章

  1. 远距离作战通信单兵系统
  2. Java是什么?主要是干什么的?
  3. 2022年必须知道的数字化转型!
  4. linux snat mac 桥,关于SNAT在bridge中不生效的问题
  5. ABBYY FineReader双十一活动跟进
  6. vc6.0关于code jock在打开多文档debug版本崩溃的问题解决
  7. 【智能驾驶】领域常见专业名称英文缩写
  8. ❤️‍Spring从入门到大神--事务管理(搞笑漫画讲解!简单易懂!!)
  9. 洛谷 P1885 Moo
  10. 家用洗地机哪个牌子质量最好?高性价比家用洗地机推荐