作者:黄山松,发表于cnblogs:http://www.cnblogs.com/tomview/

对于一个 win 的程序员,要把在 win 下的程序移植到 linux 下,需要把一些平台相关的功能代码封装一下,这样在使用这些功能的时候,可以简单调用封装好的代码,方便在不同平台下使用。本文是一个非常简单的互斥类,通过使用这个互斥类,源代码在 linux 下和 win 下保持一致。

在 win 下,互斥的代码是这几个函数:

InitializeCriticalSection

EnterCriticalSection

LeaveCriticalSection

DeleteCriticalSection

TryEnterCriticalSection

在 Linux 下,可以用对应的下面函数实现:

pthread_mutex_init

pthread_mutex_destroy

pthread_mutex_lock

pthread_mutex_unlock

封装类 auto_entercs 之后,不管在 win 还是 linux 下都使用相同的 win 下的函数就可以了,如下:

用法:

#include "auto_entercs.h"

CRITICAL_SECTION m_cs;

InitializeCriticalSection(&m_cs);

DeleteCriticalSection(&m_cs);

在需要互斥的代码区域开头声明类 auto_entercs 的局部变量,类的构造函数中自动调用 EnterCriticalSection 获取控制权,在出了变量作用域的时候,类的析构函数自动调用 LeaveCriticalSection 释放控制权。

  1. {
  2. //作用域的开始声明局部变量
  3. auto_entercs ace(&m_cs);
  4.  
  5. //互斥区域代码。。。
  6.  
  7. //离开作用域的时候自动释放控制权
  8.  
  9. }

auto_entercs.h 的代码如下:

  1. #ifndef _X_HSS_CRITICAL_SECTION_HSS__
  2. #define _X_HSS_CRITICAL_SECTION_HSS__
  3.  
  4. /**************************************************************************************************\
  5. 用于 win32 和 linux 下的通用的互斥类,如下的使用代码在 win 下和 linux 下使用同样的代码使用互斥
  6.  
  7. 用法:
  8.  
  9. (0) 包含
  10. #include "auto_entercs.h"
  11.  
  12. (1) 定义
  13. CRITICAL_SECTION m_cs;
  14.  
  15. (2) 初始化
  16. InitializeCriticalSection(&m_cs);
  17.  
  18. (3) 进入和离开互斥
  19. {
  20. auto_entercs ace(&m_cs);
  21. ....互斥区域
  22. }
  23.  
  24. (4) 删除
  25. DeleteCriticalSection(&m_cs);
  26.  
  27. 作者: 黄山松,http://www.cnblogs.com/tomview/
  28.  
  29. \**************************************************************************************************/
  30. #ifdef WIN32
  31.  
  32. #include <windows.h>
  33.  
  34. #else
  35.  
  36. #include <pthread.h>
  37.  
  38. #define CRITICAL_SECTION pthread_mutex_t
  39. #define InitializeCriticalSection(p) \
  40. { \
  41. pthread_mutexattr_t attr; \
  42. pthread_mutexattr_init(&attr); \
  43. pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); \
  44. pthread_mutex_init((p), &attr); \
  45. }
  46. #define DeleteCriticalSection(p) pthread_mutex_destroy(p)
  47. #define EnterCriticalSection(p) pthread_mutex_lock(p)
  48. #define LeaveCriticalSection(p) pthread_mutex_unlock(p)
  49.  
  50. #endif
  51.  
  52. //auto_entercs 需要在互斥代码区域内声明局部变量,当代码执行出区域的时候,析构函数自动调用LeaveCriticalSection
  53. class auto_entercs
  54. {
  55. public:
  56. auto_entercs(CRITICAL_SECTION* pcs)
  57. {
  58. m_pcs = pcs;
  59.  
  60. if (m_pcs)
  61. {
  62. EnterCriticalSection(m_pcs);
  63. }
  64. }
  65.  
  66. ~auto_entercs()
  67. {
  68. if (m_pcs)
  69. {
  70. LeaveCriticalSection(m_pcs);
  71. }
  72. }
  73.  
  74. CRITICAL_SECTION* m_pcs;
  75. };
  76.  
  77. #endif

WIN 程序员的 Linux 互斥类的更多相关文章

  1. 程序员藏经阁 Linux兵书

    程序员藏经阁 Linux兵书 刘丽霞 杨宇 编   ISBN 978-7-121-21992-4 2014年1月出版 定价:79.00元 536页 16开 内容提要 <Linux兵书>由浅 ...

  2. .Net程序员学习Linux(一)

    本次知识点:Linux系统的多终端切换,linux下的用户,linux远程访问工具使用,linux下重要的目录,命令的组成,通配符,linux的路径问题,文件操作的综合运用 为什么学习linux? 1 ...

  3. Net程序员学习Linux

    Net程序员学习Linux 本次知识点:Linux系统的多终端切换,linux下的用户,linux远程访问工具使用,linux下重要的目录,命令的组成,通配符,linux的路径问题,文件操作的综合运用 ...

  4. 调皮的程序员:Linux之父雕刻在Linux内核中的故事

    本文内容由公众号“格友”原创分享. 1.引言   (不羁的大神,连竖中指都这么帅) 因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人.虽然大家可能都听过钱钟书先生的名言:“假如你吃 ...

  5. 程序员自己编写的类和JDK类是一种合作关系。

    封装类: JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载. 除了int和char,其余类型首字母大写即成封装类. 转换字符的方式: int I=10; Str ...

  6. 程序员自己编写的类和JDK类是一种合作关系

    封装类: JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载. 除了int和char,其余类型首字母大写即成封装类. 转换字符的方式: int I=10; Str ...

  7. 零基础程序员入门Linux系统 !如何快速恢复系统?

    新手在学习Linux系统的时候,难免会遇到命令输错,或系统出错的难题.那么如何快速解决呢?本文就先给你一个后悔药,让你快速备份并恢复Linux系统.本文将以Ubuntu为例,在这之前,你需要一台服务器 ...

  8. .Net程序员学习Linux最简单的方法

    有很多关于Linux的书籍,博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...

  9. 转:.Net程序员学习Linux最简单的方法

    有很多关于Linux的书籍,博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...

随机推荐

  1. php中的常用数组函数(七) 数组合并 array_merge()和array_merge_recursive()

    $arr1 = array(1, 2, 3, 4, 'color'=>'red'); $arr2 = array('a', 'b', 'c', 'color'=>'blue'); prin ...

  2. java 内部类 *** 最爱那水货

    注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...

  3. [moka同学笔记]Yii2 数据操作Query Builder

    Query Builder [php] view plain copy   $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name ...

  4. JVM调优总结:调优方法

    JVM调优总结:调优方法 2012-01-10 14:35 和你在一起 和你在一起的博客 字号:T | T 下面文章将讲解JVM的调优工具以及如何去调优等等问题,还有一些异常问题的处理.详细请看下文. ...

  5. Webpack - CommonJs & AMD 模块打包器

    Webpack 是一个 CommonJs & AMD 模块打包器.可以把你的 JavaScript 代码分离为多个包,在需要的时候进行加载,支持预处理文件,例如 json, jade, cof ...

  6. Remodal – 支持 Hash 追踪的响应式模态窗口

    Remodal 是一个扁平化,响应式,轻量而且容易定制的模态窗口插件,支持使用声明状态和 Hash 跟踪.您可以轻松地定义为模态弹窗定义背景景容器(如模糊效果).支持所有现代的浏览器. 您可能感兴趣的 ...

  7. Hexo - 快速,轻量,强大的 Node.js 博客框架

    Hexo 是一个快速,轻量,强大的 Node.js 博客框架.带给你难以置信的编译速度,瞬间生成静态文件:支持 Markdown,甚至可以在 Hexo 中集合 Octopress 插件:只需要一个命令 ...

  8. 由Vue引发的getter和setter思考

    公司的新项目决定使用Vue.js来做,当我打印出Vue实例下的data对象里的属性时,发现了一个有趣的事情: 它的每个属性都有两个相对应的get和set方法,我觉的这是多此一举的,于是去网上查了查Vu ...

  9. JavaScript 数据类型判断

    JavaScript 的数据类型分为两类:原始类型(基本类型)和对象类型(引用类型).原始类型包括数字.字符串和布尔值,另外有两个特殊的原始值:null 和 undefined,除此之外的都是对象.对 ...

  10. JavaSript模块规范 - AMD规范与CMD规范介绍 (转载lovenyf.blog.chinaunix.net)

    JavaSript模块化   在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?       模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题 ...