WIN 程序员的 Linux 互斥类
作者:黄山松,发表于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 释放控制权。
{
//作用域的开始声明局部变量
auto_entercs ace(&m_cs);
//互斥区域代码。。。
//离开作用域的时候自动释放控制权
}
auto_entercs.h 的代码如下:
#ifndef _X_HSS_CRITICAL_SECTION_HSS__
#define _X_HSS_CRITICAL_SECTION_HSS__ /**************************************************************************************************\
用于 win32 和 linux 下的通用的互斥类,如下的使用代码在 win 下和 linux 下使用同样的代码使用互斥 用法: (0) 包含
#include "auto_entercs.h" (1) 定义
CRITICAL_SECTION m_cs; (2) 初始化
InitializeCriticalSection(&m_cs); (3) 进入和离开互斥
{
auto_entercs ace(&m_cs);
....互斥区域
} (4) 删除
DeleteCriticalSection(&m_cs); 作者: 黄山松,http://www.cnblogs.com/tomview/ \**************************************************************************************************/
#ifdef WIN32 #include <windows.h> #else #include <pthread.h> #define CRITICAL_SECTION pthread_mutex_t
#define InitializeCriticalSection(p) \
{ \
pthread_mutexattr_t attr; \
pthread_mutexattr_init(&attr); \
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP); \
pthread_mutex_init((p), &attr); \
}
#define DeleteCriticalSection(p) pthread_mutex_destroy(p)
#define EnterCriticalSection(p) pthread_mutex_lock(p)
#define LeaveCriticalSection(p) pthread_mutex_unlock(p) #endif //auto_entercs 需要在互斥代码区域内声明局部变量,当代码执行出区域的时候,析构函数自动调用LeaveCriticalSection
class auto_entercs
{
public:
auto_entercs(CRITICAL_SECTION* pcs)
{
m_pcs = pcs; if (m_pcs)
{
EnterCriticalSection(m_pcs);
}
} ~auto_entercs()
{
if (m_pcs)
{
LeaveCriticalSection(m_pcs);
}
} CRITICAL_SECTION* m_pcs;
}; #endif
WIN 程序员的 Linux 互斥类的更多相关文章
- 程序员藏经阁 Linux兵书
程序员藏经阁 Linux兵书 刘丽霞 杨宇 编 ISBN 978-7-121-21992-4 2014年1月出版 定价:79.00元 536页 16开 内容提要 <Linux兵书>由浅 ...
- .Net程序员学习Linux(一)
本次知识点:Linux系统的多终端切换,linux下的用户,linux远程访问工具使用,linux下重要的目录,命令的组成,通配符,linux的路径问题,文件操作的综合运用 为什么学习linux? 1 ...
- Net程序员学习Linux
Net程序员学习Linux 本次知识点:Linux系统的多终端切换,linux下的用户,linux远程访问工具使用,linux下重要的目录,命令的组成,通配符,linux的路径问题,文件操作的综合运用 ...
- 调皮的程序员:Linux之父雕刻在Linux内核中的故事
本文内容由公众号“格友”原创分享. 1.引言 (不羁的大神,连竖中指都这么帅) 因为LINUX操作系统的流行,Linus 已经成为地球人都知道的名人.虽然大家可能都听过钱钟书先生的名言:“假如你吃 ...
- 程序员自己编写的类和JDK类是一种合作关系。
封装类: JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载. 除了int和char,其余类型首字母大写即成封装类. 转换字符的方式: int I=10; Str ...
- 程序员自己编写的类和JDK类是一种合作关系
封装类: JAVA为每一个简单数据类型提供了一个封装类,使每个简单数据类型可以被Object来装载. 除了int和char,其余类型首字母大写即成封装类. 转换字符的方式: int I=10; Str ...
- 零基础程序员入门Linux系统 !如何快速恢复系统?
新手在学习Linux系统的时候,难免会遇到命令输错,或系统出错的难题.那么如何快速解决呢?本文就先给你一个后悔药,让你快速备份并恢复Linux系统.本文将以Ubuntu为例,在这之前,你需要一台服务器 ...
- .Net程序员学习Linux最简单的方法
有很多关于Linux的书籍,博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...
- 转:.Net程序员学习Linux最简单的方法
有很多关于Linux的书籍,博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...
随机推荐
- Scalaz(43)- 总结 :FP就是实用的编程模式
完成了对Free Monad这部分内容的学习了解后,心头豁然开朗,存在心里对FP的疑虑也一扫而光.之前也抱着跟大多数人一样的主观概念,认为FP只适合学术性探讨.缺乏实际应用.运行效率低,很难发展成现实 ...
- [翻译]:SQL死锁-死锁排除
As we already saw, the reasons why we have blocking issues and deadlocks in the system are pretty mu ...
- 我们为什么要配置CATALINA_HOME环境变量
用文本编辑工具打开用于启动Tomcat的批处理文件startup.bat,仔细阅读.在这个文件中,首先判断CATALINA_HOME环境变量是否为空,如果为空,就将当前目录设为CATALINA_HOM ...
- php 相关模块备忘
在安装php的时候,不管是编译安装: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
- Vue.js – 基于 MVVM 实现交互式的 Web 界面
Vue.js 是用于构建交互式的 Web 界面的库.它提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单.灵活的 API.从技术上讲, Vue.js 集中在 MVVM 模式上的视图模型层,并 ...
- 15款加速 Web 开发的 JavaScript 框架
JavaScript 可以通过多种方式来创建交互式的网站和 Web 应用程序.利用 JavaScript,可以让你移动 HTML 元素,创建各种各样的自定义动画,给你的访问者更好的终端用户体验. 对于 ...
- [deviceone开发]-QQ分享、微信分享和新浪微博分享
一.简介 该demo主要实现QQ分享.微信分享和新浪微博分享.(调试包请到论坛扫描对应二维码下载) 二.效果图 三.相关讨论 http://bbs.deviceone.net/forum.php?mo ...
- Web安全之CSRF攻击
CSRF是什么? CSRF(Cross Site Request Forgery),中文是跨站点请求伪造.CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任, ...
- .net弹出框
弹出框可以使用div来显示在前台增加 <div id="flowDiv" runat="server"> <div class="r ...
- SharePoint 2013 中如何使用Silverlight
1.打开VS,创建一个Silverlight程序,如下图: 2.配置选择默认的,当然也可以不勾选Host Application,如下图: 3.添加Silverlight控件,2个label和1个bu ...