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/

\**************************************************************************************************/
#ifndef 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
时间: 2024-08-10 09:58:50

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

Net程序员学习Linux

Net程序员学习Linux 本次知识点:Linux系统的多终端切换,linux下的用户,linux远程访问工具使用,linux下重要的目录,命令的组成,通配符,linux的路径问题,文件操作的综合运用 为什么学习linux? 1.很多人都说.net程序员只会在Windows的环境下进行工作,压根就不懂Linux的使用,也不懂Linux的命令,只会用鼠标,只会在图形界面下工作.其实刚开始听,心里挺不爽的,作为一个.net程序员,我所熟悉的当然是在windows下工作,因为我们压根不需要在linux

.Net程序员学习Linux(一)

本次知识点:Linux系统的多终端切换,linux下的用户,linux远程访问工具使用,linux下重要的目录,命令的组成,通配符,linux的路径问题,文件操作的综合运用 为什么学习linux? 1.很多人都说.net程序员只会在Windows的环境下进行工作,压根就不懂Linux的使用,也不懂Linux的命令,只会用鼠标,只会在图形界面下工作.其实刚开始听,心里挺不爽的,作为一个.net程序员,我所熟悉的当然是在windows下工作,因为我们压根不需要在linux环境使用编码工具,而且很多p

黑马程序员——Java集合工具类和泛型

Collections工具类和泛型 Collections和Collection Collections和Collection是不同的,Collections是工具类,用来操作集合的,而Collection是集合接口.Collections中有一系列的静态方法用来操作集合,但是不能更改集合内容.比如不能set()不能remove()元素,可以替换全部元素或者添加同一个元素. static List<String> list =Arrays .asList("one Two three

黑马程序员——黑马基础——File类,打印流

 黑马程序员--黑马基础--File类,打印流 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一,File类 用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作. File对象可以作为参数传递给流的构造函数. File类常见方法: 1,创建. boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false. 和输出流不一样,输出流对象一建立创建文件.而且文件已经存在,

黑马程序员_Java基础String类

- - - - - android培训.java培训.期待与您交流! - - - - - - - String是一个对象 String不属于8种基本数据类型(byte, char, short, int, float, long, double, boolean),String是对象,所以其默认值是null. String是一种特殊的对象,有其它对象没有的一些特性,通过JDK发现: public final class String implements java.io.Serializable

.Net程序员学习Linux最简单的方法(转载)

有很多关于Linux的书籍.博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语言来介绍Linux背景和动机. 就如同所有的的网络游戏都要先介绍游戏的历史观,然后再介绍游戏的操作. 大多数初学者在刚刚接触Linux都会有非常陌生的感觉.往往会有一些疑惑和问题.而我们就沿着这些问题,从远及近,从宏观到微观来理解Linux的简洁和美丽. 问题1:Winows有注册表,为什么Linu

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

有很多关于Linux的书籍,博客.大多数都会比较“粗暴“的将一大堆的命令塞给读者,从而使很多.NET程序员望而却步.未入其门就路过了. 所以我设想用一种更为平滑的学习方式, 就是在学习命令时,先用纯语言来介绍Linux背景和动机. 就如同所有的的网络游戏都要先介绍游戏的历史观,然后再介绍游戏的操作. 大多数初学者在刚刚接触Linux都会有非常陌生的感觉.往往会有一些疑惑和问题.而我们就沿着这些问题,从远及近,从宏观到微观来理解Linux的简洁和美丽. 问题1: Winows有注册表,为什么Lin

年薪50W程序员必备Linux知识 — 零起点学习Linux系列

年薪50W程序员必备,零点学习Linux系列视频教程 闺蜜推荐的Linux学习资料,就需要这个视频了 楼主也是买的学习视频,支付然后加楼主微信 (171301011)索取视频 原文地址:https://www.cnblogs.com/videoer/p/11628992.html

黑马程序员---Objective-C基础学习---类、对象、方法相关知识笔记

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 类.对象.方法相关知识笔记 Objective-C相对于C语言有了面向对象的特性,但是ObjC又没有其他面向对象语言那么多语法特性,ObjC本身对面向对象进行了精简.下面是一些相关知识笔记. 类定义 成员变量 方法和属性 self关键字 类定义 在C#.Java等其他高级语言中定义一个类是相当简单点的,直接一个关键字class加一对大括号基本就完成了,但是在ObjC中类的定义相对变化比较大.现