OpenThreads库介绍——Block
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相关推荐
- Android源码学习(五):AVB2.0-libavb库介绍2
感谢前辈的blog,安全相关的资料可太少了,很详细很卓越 https://blog.csdn.net/jackone12347/article/details/116241676 上一篇的末尾我们说好 ...
- 2021年大数据ELK(三):Lucene全文检索库介绍
全网最详细的大数据ELK文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 一.什么是全文检索 1.结构化数据与非结构化数据 2.搜索结构化 ...
- 强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例
强化学习(三) - Gym库介绍和使用,Markov决策程序实例,动态规划决策实例 1. 引言 在这个部分补充之前马尔科夫决策和动态规划部分的代码.在以后的内容我会把相关代码都附到相关内容的后面.本部 ...
- 实战篇一 python常用模块和库介绍
# -_-@ coding: utf-8 -_-@ -- Python 常用模块和库介绍 第一部分:json模块介绍 import json 将一个Python数据结构转换为JSON: dict_ = ...
- Python进阶11-标准库介绍02
摘要:Python标准库介绍 Python标准库是Python强大的动力所在,我们已经在前文中有所介绍.由于标准库所涉及的应用很广,所以需要学习一定的背景知识. 硬件原理 这一部份需要了解内存,CPU ...
- Python进阶10-标准库介绍01
摘要:Python标准库介绍 Python的一大好处在于它有一套很有用的标准库(standard library).标准库是随着Python一起安装在你的电脑中的,是Python的一部分 (当然也有特 ...
- C++的iostream标准库介绍
C++的iostream标准库介绍 0 为什么需要iostream 1 iostream: istream 和 ostream 2 fstream: ifstream 和 ofstream 3 str ...
- 【Alljoyn】 Alljoyn学习笔记七 Alljoyn瘦客户端库介绍
Alljoyn瘦客户端库介绍(上) 1.简介 本文档对AllJoynTM瘦客户端的核心库文件(AJTCL)进行了详尽的介绍.本文档介绍了系统整体架构,AllJoyn框架结构,并着重于介绍如何将嵌入式设 ...
- python的threading库_python标准库介绍——31 threading 模块详解
threading 模块 (可选) ``threading`` 模块为线程提供了一个高级接口, 如 [Example 3-1 #eg-3-1] 所示. 它源自 Java 的线程实现. 和低级的 ``t ...
最新文章
- 启明云端方案分享| ESP32-S2 摄像头 WIFI方案应用于智能猫眼
- 多多自走棋改动_多多自走棋腾讯版
- C++17尝鲜:类模板中的模板参数自动推导
- 微软CNTK 2.0版本发布,支持C#
- 面向对象(OOP)一
- AduSkin - UI 追求极致,永臻完美
- 【面试题22】栈的压入、弹出序列
- Win8Metro(C#)数字图像处理--2.7图像伪彩色
- Linux安装GCC方法—简洁版
- JAVA入门学习 —数组排序的方法
- MAC chrome 谷歌浏览器全屏显示——隐藏菜单栏
- 有了这些好看的流程图模板,你也可以画出漂亮的流程图
- Jupyter notebook的主题和字体美化
- java以及JavaScript的香港身份证验证方法。
- uni.showToast与uni.navigateTo同时使用问题
- 中国微粉化蜡行业市场供需与战略研究报告
- 飞机上允许携带哪些移动电源?
- 34 机器学习与人工智能
- java计算机毕业设计家教到家平台MyBatis+系统+LW文档+源码+调试部署
- LSP“浏览器劫持概念