C++:互斥量C++实现,内存调试,自动锁
/*互斥量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++实现,内存调试,自动锁的更多相关文章
- 并发编程(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题
boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...
- pthread中互斥量,锁和条件变量
互斥量 #include <pthread.h> pthread_mutex_t mutex=PTHREAD_MUTEX_INTIIALIZER; int pthread_mutex_in ...
- POSIX 使用互斥量和条件变量实现生产者/消费者问题
boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t 和pthread_cond_t的一系列的封装.因此通过 ...
- 并发编程入门(一): POSIX 使用互斥量和条件变量实现生产者/消费者问题
boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t和pthread_cond_t的一系列的封装.因此通过对 ...
- Linux的线程同步对象:互斥量Mutex,读写锁,条件变量
进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等 资源,是一个静态的概念.线程是CPU调度的对象,是一个动态的概念.一个进程之中至少包含有一个或者多个线程.这 ...
- RT-thread内核之互斥量
一.互斥量控制块:在include/rtdef.h中 #ifdef RT_USING_MUTEX /** * Mutual exclusion (mutex) structure */ struct ...
- 第29课 互斥量与自解锁(std::mutex和lock系列)
一. 互斥量 (一)Mutex系列类 1. std::mutex:独占的互斥量,不能递归使用. 2. std::recursive_mutex:递归互斥量.允许同一线程多次获得该互斥锁,可以用来解决同 ...
- Linux多线程--使用互斥量同步线程【转】
本文转载自:http://blog.csdn.net/ljianhui/article/details/10875883 前文再续,书接上一回,在上一篇文章:Linux多线程——使用信号量同步线程中, ...
- 生产者-消费者问题:介绍POSIX线程的互斥量和条件变量的使用
全局初始化互斥量和条件变量(不全局也行,但至少要对线程启动函数可见,这样才能使用.) static pthread_cont_t cond = PTHREAD_COND_INITIALIZER; st ...
- jvm-java内存模型与锁优化
java内存模型与锁优化 参考: https://blog.csdn.net/xiaoxiaoyusheng2012/article/details/53143355 https://blog.csd ...
随机推荐
- STL algorithm算法mismatch(37)
mismatch原型: std::mismatch equality (1) template <class InputIterator1, class InputIterator2> p ...
- DMA(STM32)
1.DMA:data memory access //实际的内存存储 注:DMA干活的时候是不须要CPU干涉的 2. ①内存(定义的变量)---外设(寄存器). ②内存---内存 ③外设---外 ...
- 与一线Linux嵌入式开发project师的对话
转:与一线Linux嵌入式开发project师的对话 陈project师一直做Linux的嵌入式开发.作为在开发一线的project师.他对非常多问题的看法可能更切合实际需求,于是,通过邮件.就嵌入式 ...
- 在SQL 中生成JSON数据
这段时间接手一个数据操作记录的功能,刚拿到手上的时候打算用EF做,后来经过仔细考虑最后还是觉定放弃,最后思考再三决定: 1.以模块为单位分表.列固定(其实可以所有的操作记录都放到同一个表,但是考虑到数 ...
- LNMP一键安装包sh脚本
Xshell 5 (Build 0719) Copyright (c) 2002-2015 NetSarang Computer, Inc. All rights reserved. Type `he ...
- r语言之生成规则序列,规则序列函数及用法
在生成序列时,“:”的优先级最高 (1)从1到20的整数序列: > 1:20 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (2) ...
- hibernate 单元测试 5.2
单元测试 测试 dao service action package com.kaishengit.test; import org.hibernate.Session; import com.ka ...
- Java 如何判断一个字符是否是数字或字母
在C++中, 可以用isdigit()判断一个字符是否是数字,可以用isalpha()判断一个字符是否是字母,还有很多,都在<cctype>头文件中 而类似的方法在JAVA中,则主要是Ch ...
- stl源代码剖析:编译器的提前定义位置集设置
眼下我的工作环境还是win.全部演示也用VS或者cygwin这些环境作为基础. 1.配置项目的附加include目,添加提前定义位置集设置,编译器会把它添加include路径,比方在某个目录中定义一个 ...
- ubuntu ???????????? no permissions 问题解决
近期的一个项目须要用到linux开发android程序! 发现ubuntu有小米开发连接不上! 搞了一个下午才搞成功! 看看吧! 小米手机利用USB连接到Ubuntu 10.04系统.执行以下的命令 ...