存档

2011年4月 的存档

条件变量(Condition Variable)详解

2011年4月24日 9 条评论

条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法。举个简单的例子,应用程序A中包含两个线程t1和t2。t1需要在bool变量test_cond为true时才能继续执行,而test_cond的值是由t2来改变的,这种情况下,如何来写程序呢?可供选择的方案有两种:

  • 第一种是t1定时的去轮询变量test_cond,如果test_cond为false,则继续休眠;如果test_cond为true,则开始执行。
  • 第二种就是上面提到的条件变量,t1在test_cond为false时调用cond_wait进行等待,t2在改变test_cond的值后,调用cond_signal,唤醒在等待中的t1,告诉t1 test_cond的值变了,这样t1便可继续往下执行。
  • 很明显,上面两种方案中,第二种方案是比较优的。在第一种方案中,在每次轮询时,如果t1休眠的时间比较短,会导致cpu浪费很厉害;如果t1休眠的时间比较长,又会导致应用逻辑处理不够及时,致使应用程序性能下降。第二种方案就是为了解决轮询的弊端而生的。然而条件变量在使用的过程中,比较容易出错,如何用得不正确的话,会适得其反的,接下来,我将详细分析如何来使用条件变量,希望能够给在使用条件变量过程中遇到问题的朋友有所帮助。 阅读全文…

    最近好忙

    2011年4月20日 5 条评论

    最近好忙,希望接下来的两周,项目能顺利些,早日release!写此文勉励自己,坚持最后的两个星期,小武加油!伙伴们加油!

    分类: 生活感悟 标签:

    c++ template特化小trick

    2011年4月11日 1 条评论

    前几天在看boost/asio代码的时候,遇到一个奇怪的语法,后查c++ std文档,发现是template特化过程中一个小小的trick,特做此记录,分享给遇到同样问题的朋友,下面先看例子:
    阅读全文…

    事件处理模式之Reactor(二)

    2011年4月5日 2 条评论

    本文是上一篇《事件处理模式之Reactor(一)》的下一篇,上一篇主要介绍了reactor模式的基本理论,这一篇主要通过实例,来介绍Reactor模式的具体使用。在开始本文之前,有必要再说明一下,reactor的源码的地址:reactor源码, 感兴趣的读者朋友可以自己用svn客户端check out到本地。
    如左图所示为reactor项目的基本结构,整体项目分为三个部分:

  • 一是libreactor项目,用来生成reactor相关的lib;
  • 二是server项目,是用reactor实现的一个时间服务器程序;
  • 三是client项目,是用reactor实现的一个客户端程序。
  • 服务端和客户端之间通过telnet协议进行交互,目前仅支持time和exit两个命令,客户向服务端发送time命令,服务端返回当前时间;客户端向服务端发送exit命令,服务端断开客户端连接。如果要实现其它命令,可以直接通过扩展相关处理逻辑来实现。这里我们关注的重点是reactor模式,因此不在支持的命令方面做过多的扩展,感兴趣的朋友可以自己进行扩展。 阅读全文…