/*互斥量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. IPhone多视图切换

    处理IPhone多个view切换是我们常遇到的问题,接下来有个比较实用的方法: 而且还附有创建空项目,内存告急处理和动画效果的实现! 具体步骤: 1.创建一个空的项目,然后添加一个ViewContro ...

  2. Failed to upgrade Oracle Cluster Registry configuration(root.sh)

        近期在给客户基于Suse 11 sp3安装Oracle 10g RAC,在安装完clusterware运行/u01/app/crs/root.sh时收到错误提示.Failed to upgra ...

  3. poj1144 Network【tarjan求割点】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4319585.html   ---by 墨染之樱花 [题目链接]http://poj.org/p ...

  4. poj2449 Remmarguts' Date【A*算法】

    转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4303855.html   ---by 墨染之樱花 [题目链接]:http://poj.org/ ...

  5. 也谈.NET MVC 2 + ExtJS的部署问题

    由于业务需要,笔者刚进到一个项目组,由于没有美工,前台采用ExtJs + MVC 2 ,迭代1的项目做的还算比较顺利,至少在本机上是运行没有任何问题的, 但是为了给客户演示,我兴高采烈的将网站部署在I ...

  6. FtpManager类

    public class FtpManager { /// <summary> /// 主机名 /// </summary> string ftpServerIP; /// & ...

  7. 补全aaz288 可能有问题的过程 P_COMPL_AAZ288

    补全aaz288 可能有问题的过程: /* add by weiyongle 20160623 失地农民补足aaz288,针对早期导出的数据(只适用于江安县) 经测试:江安县 江安县个体劳动者 这个单 ...

  8. 在myeclipse中修改svn帐户

    把C:\Users\Administrator\AppData\Roaming\Subversion\auth\这个文件中所有文件删除 然后在myeclipse中同步会让你输入用户名和密码

  9. 两台linux机器时间同步

    Linux自带了ntp服务 -- /etc/init.d/ntpd,这个服务不仅可以设置让本机和某台/某些机器做时间同步,他本身还可以扮演一个time server的角色,让其他机器和他同步时间. 配 ...

  10. DFS(White-Gray-Black)

    参考<数据结构与算法> 本书在复杂深度优先遍历图时,采用三种颜色标记图中节点 1 white 表示未访问 2 gray 表示已经正在访问,其相邻节点 3 black 表示该节点所有的相邻节 ...