/*互斥量C++实现+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

class CMutex
{
public:
CMutex() ;
~CMutex() ; void lock() ;
void unlock() ; private: #ifdef _WIN32
CRITICAL_SECTION cs;
#else
pthread_mutex_t cs;
pthread_mutexattr_t mta ;
#endif
}; #ifdef _WIN32
CMutex::CMutex()
{
InitializeCriticalSection(&cs);
} CMutex::~CMutex()
{
DeleteCriticalSection(&cs);
} void CMutex::lock()
{
EnterCriticalSection(&cs);
} void CMutex::unlock()
{
LeaveCriticalSection(&cs);
}
#else
CMutex::CMutex()
{
pthread_mutexattr_init( &mta ) ;
pthread_mutexattr_settype( &mta , PTHREAD_MUTEX_RECURSIVE_NP ) ;
pthread_mutex_init( &cs , &mta ) ;
} CMutex::~CMutex()
{
pthread_mutexattr_destroy( &mta ) ;
pthread_mutex_destroy(&cs);
} void CMutex::lock()
{
//printf( " lock the %d \r\n" , &cs ) ;
pthread_mutex_lock(&cs);
} void CMutex::unlock()
{
//printf( " unlock the %d \r\n" , &cs ) ;
pthread_mutex_unlock(&cs);
}
#endif /* 例一 内存调试+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
//如果定义了内存调试宏
#ifdef DEBUG_MALLOC
CMutex mallocMutex ;
int malloctick = ; //-----------------------------------------------
//对内存分配增加一个计数器,用于调试内存泄露
void *debugMalloc( int size )
{
void *pmem = ;
mallocMutex.lock() ; //malloc次数+1
malloctick ++ ;
pmem = malloc( size ) ; printf( "debugMalloc count = %d\r\n" , malloctick ) ; mallocMutex.unlock() ; return pmem ;
} //-----------------------------------------------
//用于调试内存泄露
void debugFree( void *pmem )
{
mallocMutex.lock() ;
//malloc次数-1
malloctick -- ;
free( pmem ) ;
printf( "debugFree count = %d\r\n" , malloctick ) ;
mallocMutex.unlock() ;
}
#endif //DEBUG_MALLOC /* 例二 自动锁+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*自动锁作用在一个局部,在函数内部,从声明该锁开始,到函数退出时,销毁自动锁时,在析构函数里面调用CMutex::unlock()*/
class CAutoMutex
{
public:
CAutoMutex( CMutex *mutex )
{
m_pmutex = mutex ;
if( m_pmutex )
m_pmutex->lock() ;
} virtual ~CAutoMutex()
{
if( m_pmutex )
{
m_pmutex->unlock() ;
m_pmutex = NULL ;
}
};
private:
CMutex *m_pmutex ;
}; //一个使用自动锁的类
class CNetServer
{
protected:
CNetServer() ;
~CNetServer() ;
DECLARE_SINGLEOBJ( CNetServer )
public:
bool RequestTalkOn( unsigned userid );
protected:
//对讲标志状态
bool m_talkOn ;
int m_talkUserID ;
CMutex m_taklMutex ;
}; //使用示例
bool CNetServer::RequestTalkOn( unsigned userid )
{
CAutoMutex atlck( &m_taklMutex);
m_talkUserID = userid ;
m_talkOn = true ;
NETLIB_PRINTF("request Talkon success userid = %d\r\n" , userid ) ;
return true ;
}
/*THE END, ocj*/

C++:互斥量C++实现,内存调试,自动锁的更多相关文章

  1. 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...

  2. pthread中互斥量,锁和条件变量

    互斥量 #include <pthread.h> pthread_mutex_t mutex=PTHREAD_MUTEX_INTIIALIZER; int pthread_mutex_in ...

  3. POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t 和pthread_cond_t的一系列的封装.因此通过 ...

  4. 并发编程入门(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...

  5. Linux的线程同步对象:互斥量Mutex,读写锁,条件变量

        进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等 资源,是一个静态的概念.线程是CPU调度的对象,是一个动态的概念.一个进程之中至少包含有一个或者多个线程.这 ...

  6. RT-thread内核之互斥量

    一.互斥量控制块:在include/rtdef.h中 #ifdef RT_USING_MUTEX /** * Mutual exclusion (mutex) structure */ struct ...

  7. 第29课 互斥量与自解锁(std::mutex和lock系列)

    一. 互斥量 (一)Mutex系列类 1. std::mutex:独占的互斥量,不能递归使用. 2. std::recursive_mutex:递归互斥量.允许同一线程多次获得该互斥锁,可以用来解决同 ...

  8. Linux多线程--使用互斥量同步线程【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10875883 前文再续,书接上一回,在上一篇文章:Linux多线程——使用信号量同步线程中, ...

  9. 生产者-消费者问题:介绍POSIX线程的互斥量和条件变量的使用

    全局初始化互斥量和条件变量(不全局也行,但至少要对线程启动函数可见,这样才能使用.) static pthread_cont_t cond = PTHREAD_COND_INITIALIZER; st ...

  10. jvm-java内存模型与锁优化

    java内存模型与锁优化 参考: https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/53143355 https://blog.csd ...

随机推荐

  1. 分析php获取客户端ip

    用php能获取客户端ip,这个大家都知道,代码如下: /** * 获取客户端ip * @param number $type * @return string */ function getClien ...

  2. Effective C++ 条款39

    我从本条款中学到了下面内容: 1.private继承不同于另外两种继承,派生类对象不能隐式转换为基类对象. 例如以下代码: class Bird//鸟 { }; class ostrich:priva ...

  3. C#多线程编程简述

    NET将关于多线程的功能定义在System.Threading名字空间中.因此,要使用多线程,必须先声明引用此名字空间(using System.Threading;). a.启动线程顾名思义,“启动 ...

  4. Ext JS学习第十四天 Ext基础之 Ext.DomHelper

    此文用来记录学习笔记   •我们已经学过了Element这个类,无疑是非常强大的,里面提供了丰富的方法供我们使用,但是Ext为了更加的方便我们去操作DOM元素,特提供了DomHelper这个辅助的工具 ...

  5. 【监控】使用probe对tomcat服务进行监控

    1.运行环境(博主本地) JDK:jdk1.6 Tomcat:tomcat7 OS:Windows10 2.下载 点击下载 3.安装运行 1.解压,将probe文件夹复制放进tomcat里面的weba ...

  6. STL之set和multiset(集合)

    set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. constructing sets #include #include using names ...

  7. [LeetCode]题解(python):026-Remove Duplicates from Sorted Array

    题目来源: https://leetcode.com/problems/remove-duplicates-from-sorted-array/ 题意分析: 给定一个排好序的数组,去除重复的数,返回新 ...

  8. Java学习之IO之File类二

    之前学了File便想把我学习视频的名字改了,因为文件名太长不好看,便试着写了个功能实现 package com.gh.file; import java.io.File; /** * 批量文件命名 * ...

  9. MFC基础类源码CPP实现文件

    WinMain.CPP---->AfxWinMain()  //近似可认为是WinMain()函数的入口 VIEWCORE.CPP---->CView DOCCORE.CPP----> ...

  10. Hadoop Security Authentication Terminology --Kerberos

    Hadoop Security Authentication Terminology --Kerberos What is kinit? Kinit -  obtain and cache Kerbe ...