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程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语 ...
随机推荐
- JVM内存格局总结
最近一次面试,面试官让我讲讲JVM的内存这一块的理解.我回答的不满意,今天做一个总结. 做一个产品,最终要做到高并发.高可靠.归根结底,是对CPU.内存等资源受限所作出的解决方案.就内存而言,我们写的 ...
- 简单的mysql查询
mysql是基于客户机-服务器的数据库.客户机-服务器应用分为两个不同的部分.服务器部分是负责所有数据访问和处理的一个软件. 连接mysql 要连接mysql需要知道如下 主机名: 本地为localh ...
- javascript之八——BOM
8.1 window对象 BOM的核心对象是window--表示浏览器的一个实例.window有双重角色: 是通过javascript访问浏览器窗口的一个接口: 是ECMAScript规定的Globa ...
- 更新整理本人所有博文中提供的代码与工具(C++,2013.08)
为了更方便地管理博文中涉及的各种代码与工具资源,现在把这些资源迁移到 Google Code 中,有兴趣者可前往下载. C++ 1.<通用高性能 Windows Socket 组件 HP-Soc ...
- cnodejs社区论坛4--话题列表
- GJM :FPSCalc-简单FPS观测类 [转载]
版权声明:本文原创发表于 [请点击连接前往] ,未经作者同意必须保留此段声明!如有侵权请联系我删帖处理! FPSCalc--简单FPS观测类 利用Unity做的手游项目很多时候要保证流畅度,流畅度最直 ...
- [转]Dcloud App离线本地存储方案
原文地址:http://ask.dcloud.net.cn/article/166 HTML5+的离线本地存储有如下多种方案:HTML5标准方案:cookie.localstorage.session ...
- 【javascript激增的思考03】MVVM与Knockout
前言 今天搞的有点快,因为上午简单研究了下MVC,发现MVC不太适合前端开发,然后之前看几位前端前辈都推荐前端使用MVVM,但是我对其还不甚了解,所以我觉得下午还是应该先看看他是神马先,后面再决定要不 ...
- pdo mysql错误:Cannot execute queries while other unbuffered queries are active
运行环境:PHP 5.5.30-x64,MYSQL 5.6.27 错误代码:Cannot execute queries while other unbuffered queries are act ...
- Web安全之点击劫持(ClickJacking)
点击劫持(ClickJacking)是一种视觉上的欺骗手段.大概有两种方式,一是攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,此时用户将在不知情的情况下点击透明的 ...