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

OpenRTMFP/Cumulus Primer(20)Cumulus的一个线程启动 Bug

 
阅读更多

OpenRTMFP/Cumulus Primer(20)Cumulus的一个线程启动 Bug

  • 作者:柳大·Poechant(钟超)
  • 邮箱:zhongchao.ustc#gmail.com(# -> @)
  • 博客:Blog.CSDN.net/Poechant
  • 日期:June 25th, 2012

Cumulus 中的线程都是继承自 Startable,在其中封装 Poco::Thread 成员,使得一些有关线程的操作更方便。Startable 中的 start 函数如下:


void Startable::start() {
    if(!_stop) // if running
        return;
    ScopedLock<fastmutex> lock(_mutex);
    <span class="keyword" style="font-weight: bold; ">if</span>(_haveToJoin) {
        _thread.join();
        _haveToJoin=<span class="keyword" style="font-weight: bold; ">false</span>;
    }
    <span class="keyword" style="font-weight: bold; ">try</span> {
        DEBUG(<span class="string" style="color: rgb(136, 0, 0); ">"Try to start up a new thread inherited from Startable"</span>);
        _thread.start(_process);
        _haveToJoin = <span class="keyword" style="font-weight: bold; ">true</span>;
        ScopedLock<fastmutex> lock(_mutexStop);
        _stop=<span class="keyword" style="font-weight: bold; ">false</span>;
    } <span class="keyword" style="font-weight: bold; ">catch</span> (Poco::Exception&amp; ex) {
        ERROR(<span class="string" style="color: rgb(136, 0, 0); ">"Impossible to start the thread : %s"</span>,ex.displayText().c_str());
    }
}
</fastmutex></fastmutex>

这样一个类继承 Startable 的话,并启动时传入自己,则会调用到 Startable::start(),然后调用到该类自己的 run() 函数。一般来说这个函数会一个循环,以 SocketManager 为例:


void SocketManager::run() {
    … 
    while(running()) {
    …
    }
}

我们要看看这个 running() 是怎么回事,如下:


inline bool Startable::running() const {
    return !_stop;
}

很简单,就是通过 Startable::_stop 成员来判断是否还需要继续循环下去。那么这个 _stop 是什么时候被设置为 false 的呢?就是上面的 start(),这里存在的一个问题就是先 start 线程,再设置 _stop 为 false。


_thread.start(_process);
_stop=false;

而 start() 之后 run() 的时候就开始通过 running() 来判断 _stop 值了。所以你会在使用 Cumulus 时,发现有时候启动起来的线程个数不对。正常情况下应该有四个线程:

icon Resize

它们是:

  • 主线程
  • RTMFPServer 线程
  • MainSockets 线程
  • RTMFPManager 线程

而异常情况可能是 MainSockets 没有启动,甚至 MainSockets 和 RTMFPManager 都没有启动。

MainSockets 没有启动的情况,这时客户端是无法接入成功的。

icon Resize

MainSockets 和 RTMFPManager 都没有启动的情况 T.T

icon Resize

具体是哪个线程没有启动成功可以通过 GDB 查看。

解决办法就是将 _stop 的设置操作,在启动线程之前。不过要注意锁要同时移动,并且在产生异常时设置 _stop 值为 true。


void Startable::start() {
    if(!_stop) // if running
        return;
    ScopedLock<fastmutex> lock(_mutex);
    <span class="keyword" style="font-weight: bold; ">if</span>(_haveToJoin) {
        _thread.join();
        _haveToJoin=<span class="keyword" style="font-weight: bold; ">false</span>;
    }
    <span class="keyword" style="font-weight: bold; ">try</span> {
        DEBUG(<span class="string" style="color: rgb(136, 0, 0); ">"Try to start up a new thread inherited from Startable"</span>);
        {
            ScopedLock<fastmutex> lock(_mutexStop);
            _stop=<span class="keyword" style="font-weight: bold; ">false</span>;
        }
        _thread.start(_process);
        _haveToJoin = <span class="keyword" style="font-weight: bold; ">true</span>;
    } <span class="keyword" style="font-weight: bold; ">catch</span> (Poco::Exception&amp; ex) {
        {
            ScopedLock<fastmutex> lock(_mutexStop);
            _stop = <span class="keyword" style="font-weight: bold; ">true</span>; <span class="comment" style="color: rgb(136, 136, 136); ">// June 25th, 2012, Michael@YY</span>
        }
        ERROR(<span class="string" style="color: rgb(136, 0, 0); ">"Impossible to start the thread : %s"</span>,ex.displayText().c_str());
    }
}
</fastmutex></fastmutex></fastmutex>

-

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

-

分享到:
评论

相关推荐

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

    而Cumulus则是基于OpenRTMFP的实现,它提供了一个服务器端的框架,能够支持大规模的实时数据传输。 POCO(POrtable COmponents)是一个强大的C++库,类似于Java Class Library、苹果的Cocoa或.NET Framework,为C++...

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

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

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

    Cumulus 是一个创新性的分布式文件系统,它利用网络编码理论来优化系统的容错能力和网络资源利用率。网络编码是一种在通信网络中处理和传输信息的新方法,它通过在数据传输过程中混合不同数据片段,从而提高网络效率...

    wp-cumulus(支持中文标签)

    1. **三维动态展示**:`wp-cumulus`的核心特点就是它能够将传统的静态标签云转化为一个在三维空间中旋转的云团,每个标签如同浮云般飘动,吸引用户眼球,增加互动性。 2. **中文支持**:与许多其他标签云插件不同,...

    cumulus(浑天仪)使用手册

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

    wp-cumulus

    这款插件赋予传统的标签云一个全新的视觉体验,通过立体旋转的效果,使得用户可以更直观、有趣地浏览和探索网站的各类标签。 在WordPress中,标签是一种组织内容的有效方式,它可以帮助用户快速定位到感兴趣的主题...

    wp-cumulus_3D云标签

    在WordPress这个强大的开源博客平台中,wp-cumulus是一款极具特色的3D云标签插件。它以其独特的视觉效果和交互体验,为用户提供了全新的标签展示方式,使得博客的分类和标签更加生动、直观。本文将深入探讨wp-...

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

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

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

    这种技术利用了Cumulus库,该库是OpenRTMFP(Real-Time Media Flow Protocol)的实现,允许设备之间直接建立连接,从而减少了服务器的压力,提高了大规模音视频流传输的效率。 OpenRTMFP是由Adobe开发的协议,用于...

    wp-cumulus.rar_TagCloud._TagCloud.as_flex cumul_wp cumulus_wp cu

    【标题】"wp-cumulus.rar" 是一个与WordPress相关的压缩包,其中包含"TagCloud._TagCloud.as",这表明它与创建和展示WordPress标签云的插件有关。"flex cumul_wp cumulus_wp cu"暗示这个插件可能是用Adobe Flex技术...

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

    cumulus:Cumulus框架+ Cumulus API

    积云框架 :open_book: 文献资料 最新文档。 文档。 更多信息 有关此项目的更多信息,以及有关NASA的地球观测系统数据和信息系统(EOSDIS)及其云工作的更多信息,请联系或访问 。...这是用于Cumulus开

    Cumulus:Cumulus是一个简单,功能强大且功能强大的快速Cocoa HTTP + REST客户端,可轻松创建基于云的应用程序

    用于C的Cumulus通过与镜像与创建,获取,更新和删除远程资源相关的HTTP请求的方法,为REST服务提供了一个简单的低级接口。 它是如此简单易用,以至于使将iOS或Mac应用程序连接到Web服务变得异常简单。 专为速度而...

    Python库 | cumulus-1.1.0.tar.gz

    总结起来,cumulus-1.1.0是一个Python库,可能是用于处理云计算相关任务或数据处理的工具。它的安装和使用涉及基本的Python包管理,而具体的功能和应用则需要进一步探索其文档或源代码。对于Python开发者来说,理解...

    3D标签云单机中文版 WP-CUMULUS 1.23

    大名鼎鼎的WP-CUMULUS 3D标签云,已经改成支持中文标签,可在.htm自行添加标签链接,可以单机玩耍测试,不需要安装WordPress然后装插件~~ 主要是有些童鞋只是想要3D标签云动画,所以就提取重要文件出来稍作修改下.

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

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

    drupal -cumulus

    Cumulus 模块则是另一个流行的 Drupal 标签云实现。与 Tagadelic 不同,Cumulus 强调了视觉效果,它使用 JavaScript 来创建动态的、3D 效果的标签云。Cumulus 的设计灵感来源于同名的云朵形状,它为网站带来了现代感...

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

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

Global site tag (gtag.js) - Google Analytics