Windows下条件变量的实现

来源:互联网 发布:淘宝20万关键词 编辑:程序博客网 时间:2024/06/06 18:56

条件变量是什么?

是一种同步对象。

 

条件变量有什么用?

用于复杂的、多线程的、多核的程序中,实现多个线程间同步任务。

 

条件变量与其它同步对象的区别?

与事件、互斥锁、segment等同步对象相比,条件变量最大的不同在于”条件“二字,其它同步对象的同步”条件“是固定的,如事件的被激发,互斥锁被释放,而条件变量的"条件"是完全自定义的,比如你可以实现当”张三赚了5块钱、李四在看电视、奥巴马访问马尔它“时,条件变量完成同步。所以说条件变量可用于复杂的同步任务。

 

Windows下有没有条件变量?

简单的答案是:没有,Windows API没有提供条件变量对象,这就是本文会存在的原因和要解决的问题。

复杂点的答案是:

  1. 使用Windows Vista之后的版本(Vista之后的版本提供了native的条件变量对象;
  2. 从开源库中抽取;
  3. 你可以自已实现;

 

方案1不现实,因为现阶段你的客户大多数还是使用windows xp/2003以下的版本,而且Vista卖的也并不好;
方案2可以参考ace库,不过太多条件宏和不相关代码,难以抽取使用(你不可能为了一个同步变量,而扯进整个庞大的ace库吧);
方案3难度更大,必须要熟悉多线程编程,还要考虑很多变态的细节,我就是采用方案3 - 自已实现的,因为网上没有现成的,不得已而为之!而你就不必重新造轮子,直接copy下面的代码到你的项目里就可以直接使用了(只要你的项目是C++的)。

 

实现代码如下:

 

 

 

    以上代码采用模板实现,变件变量类my_condition的模板参数是与条件变量配合使用的互斥量类型,为了方便直接使用,互斥量类型我也一并提供了: my_mutex。

 

    代码我已在项目中测试使用过,如果发现问题,欢迎各路高手批评指正。