`
Poechant
  • 浏览: 227450 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24243
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22047
社区版块
存档分类
最新评论

OpenRTMFP/Cumulus Primer(22)线程逻辑分析之一:RTMFPServer线程的启动和等待

 
阅读更多

OpenRTMFP/Cumulus Primer(22)RTMFPServer线程的启动和等待

  • 作者:柳大·Poechant(钟超 Michael)
  • 博客:Blog.csdn.net/poechant
  • 邮箱:zhongchao.ustc@gmail.com
  • 日期:August 5th, 2012

1 Poco::Thread

Cumulus 大量使用了 Poco 的线程库。一个简单的 Poco 线程的使用实例如下:

class PoechantRunnable: public Poco::Runnable {
    virtual void run() {
        // your codes
    }
};

int main() {
    PoechantRunnable runnable;  // Image that it's a gift
    Poco::Thread thread;        // And… thread is just like your girl
    thread.start(runnable);     // Okay, give your sweet babe the gift :)
    thread.join();
    return 0;
}

2 封装一个可运行线程的类

Cumulus 中实现了一个 StartableProcess 类,该类继承了 Runnable,就是上面那个 gift 喽。

class StartableProcess : public Poco::Runnable{
public:
    StartableProcess(Startable& startable);
private:
    void run();
    Startable& _startable;
};

可以看到其中有Startable& _startable引用成员,它并没有继承 Runnable,而是封装了StartableProcessPoco::Thread

Poco::Thread            _thread;
StartableProcess        _process;

这里Startable封装了一个StartableProcess成员,与StartableProcess是有所区别的。接下俩我们看他们是怎么用的。

3 启动RTMFPServer线程

我们可以看到在 Startable 类的构造函数中初始化了_process成员,初始化线程成员并传入线程名,设定标志域(Flag Field)_stoptrue,因为它还没有调用启动函数。

Startable::Startable(const string& name)
    : _name(name),
      _thread(name),
      _stop(true),
      _haveToJoin(false),
      _process(*this) {
}

初始化_process时,调用StartableProcess构造函数:

StartableProcess::StartableProcess(Startable& startable)
    : _startable(startable){
}

传入_startable的引用。在 Cumulus 中所有的线程的可运行类都是继承自 Startable 类的,然后通过调用 start() 来启动,启动后会响应到 run()。下面我们以 RTMFPServer 线程为例。

RTMFPServer 类是继承自 Startable 类的:

class RTMFPServer
    : private Gateway,
      protected Handler,
      private Startable,
      private SocketHandler

RTMFPServer 的构造函数:

RTMFPServer::RTMFPServer(UInt32 cores)
    : Startable("RTMFPServer"),
      _sendingEngine(cores),
      _receivingEngine(cores),
      _pCirrus(NULL),
      _handshake(_receivingEngine,
      _sendingEngine,
      *this,
      _edgesSocket,*this,*this),
      _sessions(*this) {
}

其中在初始化时调用了其父类的构造函数。接下来就要启动RTMFPServer线程了。

所在线程 调用者 函数
主线程 main(…)
主线程 RTMFPServer对象 RTMFPServer::start()
主线程 RTMFPServer对象 Startable::start()
主线程 RTMFPServer从Startable继承来的Thread成员 Thread::start(…)
RTMFPServer RTMFPServer对象从Startable继承来的StartableProcess成员 StartableProcess::run()
RTMFPServer RTMFPServer对象 RTMFPServer::prerun()
RTMFPServer RTMFPServer对象 Startable::prerun()
RTMFPServer RTMFPServer对象 RTMFPServer::run()

4 RTMFPServer线程等待

RTMFPServer::run()实现线程的持续运行,主要是依靠这两行代码:

while (!terminate)
    handle(terminate);

handle(…)函数很简单,如下只进行了sleep(...)giveHandle()两个操作。

void RTMFPServer::handle(bool& terminate){
    if (sleep() != STOP) {
        giveHandle();
    } else
        terminate = true;
}

sleep(…)是 RTMFPServer 是从 Startable 继承而来的,声明如下:

WakeUpType sleep(Poco::UInt32 timeout=0);

定义如下:

Startable::WakeUpType Startable::sleep(UInt32 timeout) {
    if (_stop)
        return STOP;
     WakeUpType result = WAKEUP;
     if (timeout>0) {
         if (!_wakeUpEvent.tryWait(timeout))
             result = TIMEOUT;
     } else {
         _wakeUpEvent.wait();
     }
    if (_stop)
        return STOP;
    return result;
}

在运行状态下,_stopfalse,而默认参数timeout0,所以会调用:

_wakeUpEvent.wait();

这个_wakeUpEvent成员是一个Poco::Event对象,Poco::Event有一个使用方式就是在调用Poco::Event::wait()后,会一直等待Poco::Event::set()被调用后,才会跳出 wait 的状态。在 Cumulus 中 set 的动作是由:

  • RTMFPServer::requestHandle()
  • PoolThread::push(Poco::AutoPtr<RunnableType>& pRunnable)

执行的。

-

转载请注明柳大·Poechant(钟超)的CSDN博客:Blog.CSDN.net/Poechant

-

分享到:
评论

相关推荐

    OpenRTMFP Cumulus Primer()入门介绍与部署CumulusServer.pdf

    《OpenRTMFP Cumulus Primer 入门与CumulusServer部署》 OpenRTMFP (Real Time Media Flow Protocol) 是一种技术,它为Flash实时应用提供了高并发扩展能力。OpenRTMFP/Cumulus是基于GNU General Public License的...

    cumulus-linux-cookbook:用于管理积云开关的手册

    这本食谱在 vanilla Debian 上创建了一个交换机覆盖,并且还部署在 Cumulus 路由器/交换机上。 要求 测试 访问 Debian Wheezy 盒子 生产 访问 Cumulus HCL [1] 开关(Accton AS6701_32X,这就是这本食谱最初的目的)...

    Cumulus:一个基于网络编码的分布式文件系统.pdf

    在分布式计算领域,分布式文件系统是支撑大规模数据处理和存储的关键技术之一。Cumulus 是一个创新性的分布式文件系统,它利用网络编码理论来优化系统的容错能力和网络资源利用率。网络编码是一种在通信网络中处理和...

    cumulus-linux-4.4.0-vx-amd64-qemu.zip

    Cumulus Linux 4.4.0 是一个专为网络设备设计的开源操作系统,它将Linux的强大功能与网络硬件的灵活性相结合。这个版本是为AMD64架构设计的,并且已经打包成了一个适用于QEMU(Quick Emulator)的虚拟机镜像文件,...

    wp-cumulus

    "wp-cumulus" 是一款在WordPress平台上的插件,专为博客或网站提供美观的三维标签云展示。这款插件赋予传统的标签云一个全新的视觉体验,通过立体旋转的效果,使得用户可以更直观、有趣地浏览和探索网站的各类标签。...

    cumulus(浑天仪)使用手册

    《浑天仪(Cumulus)使用手册》是一个详细介绍如何使用Cumulus这一开源工具的文档,主要面向对源码和工具感兴趣的IT从业者。Cumulus可能是基于Web的项目管理工具或者数据分析平台,而`swfobject.js`和`tagcloud.swf`...

    wp-cumulus(支持中文标签)

    综上所述,`wp-cumulus`是一款集美观、实用和易用于一体的WordPress标签云插件,它的出现为博客增添了新的活力,同时也提供了展示中文标签的良好解决方案。如果你正在寻找一种方式让你的博客标签更加引人注目,`wp-...

    Flex P2P 音视频流客户端(Cumulus支持)

    Flex P2P 音视频流客户端是基于Adobe Flex技术实现的一种点对点(P2P)通信解决方案,它主要用于在互联网上实时传输音频和视频数据。这种技术利用了Cumulus库,该库是OpenRTMFP(Real-Time Media Flow Protocol)的...

    RTMFP服务器脚本CumulusServer.zip

    openrtmfp又名Cumulus Server是一个完全开源和跨平台的可扩展的RTMFP服务器脚本。Cumulus Server在GPL 框架下遵循速度、优势、跨平台、轻量和高质量代码。Cumulus Server的每一个版本都是通过严格测试和审核的。可...

    HPCCloud:基于 CloudWeb 的仿真环境

    高性能计算云 目标 ...$ vi /opt/hpccloud/cumulus/cumulus/conf/config.json +- &gt; Fix host to be localhost +- &gt; baseUrl: " http://localhost:8080/api/v1 " , $ sudo service celeryd restar

    cumulus:Cumulus框架+ Cumulus API

    有关此项目的更多信息,以及有关NASA的地球观测系统数据和信息系统(EOSDIS)及其云工作的更多信息,请联系或访问 。 :hammer: 发展 Cumulus核心回购是管理的 。 Lerna负责安装此存储库中的软件包和任务的依赖关系...

    docs:Cumulus Networks文档库

    Hugo包含一个本地开发服务器,用于构建和查看仓库的实时更改。 要构建和查看实时站点: 从扩展安装Hugo 0.65.3版本。 用hugo version验证雨果。 该站点支持Hugo 0.65.3版。 hugo version命令的输出应为: Hugo ...

    wp-cumulus_3D云标签

    在配置方面,wp-cumulus提供了一系列可自定义的选项,包括标签字体大小、颜色、旋转速度、透明度等,以适应不同网站的设计风格和需求。此外,还可以设置是否显示标签的计数,以及标签的排列方式等。这些设置都在...

    Cumulus官网视频会议样例代码

    这里给出了cumulus/OpenRTMFP的git官网提到的视频会话样例的AS3代码,包括服务器端和客户端两部分,我已经在&lt;使用Cumulus和Flash Player搭建视频会议示例&gt;http://blog.csdn.net/tao_627/article/details/18041473中给...

    cumulus:Cumulus是一个高级Dart框架,它使在Firebase之上快速开发应用程序逻辑成为可能

    Cumulus是一个高级框架,可让您在Firebase之上快速而简单地开发应用程序逻辑。特征积云具有以下bonza功能: 功能端点的简单,直接配置可路由端点可路由和不可路由端点的通用接口可路由端点的命名参数(例如: /users...

    Cumulus:CloudApp 的开源替代品,利用您自己的 S3 进行存储

    积云Cumulus 是的免费、开源替代品,它利用您自己的 S3 进行存储。下载您可以在下载最新版本更改默认截图目录这是可选的。 默认情况下,OS X 会将屏幕截图放在您的桌面上。 但是,如果您希望他们去其他地方,您可以...

    ansible-cumulus-interfaces:积云开关的辅助角色

    Ansible角色:Cumulus界面 该角色将在主干(和上行链路)交换机上设置OSPF(FRR)。 此外,还将在叶子交换机上配置接口并配置PoE。 Naturalis将此角色与私人库存一起使用。 要求 没有任何。 角色变量 下面列出了...

    cumulus-api:Cumulus API文档

    Cumulus API文档 Cumulus API文档: : 安装 $ npm install 建造 $ npm run build 服务 $ npm run serve 部署 $ npm run deploy

    cumulus-integration-tests:Cumulus工作流的集成测试[已弃用]

    Cumulus集成测试项目[已弃用] 注意:此存储库不再维护。 该存储库的内容已移至。 什么是积云? Cumulus是NASA未来地球科学数据流的基于云的数据提取,存档,分发和管理原型。 阅读 安装 nvm use npm install 在...

    cumulus-dashboard:积云 A​​PI 仪表板

    用于为 Cumulus API 生成和部署仪表板的代码。 文档 其他页面: 配置 仪表板由从 Cumulus API 检索到的数据填充。 在构建和部署仪表板之前,必须预先确定和设置 Cumulus API 的环境。 配置仪表板所需的信息可在app/...

Global site tag (gtag.js) - Google Analytics