博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 以对象管理资源
阅读量:6089 次
发布时间:2019-06-20

本文共 2437 字,大约阅读时间需要 8 分钟。

C++中使用到的资源可能很多,并且一些资源获取后还必须释放归还给系统, 列举几个如:

1. 打开的文件句柄

2. 数据库连接

3. 互斥锁

4. 动态分配new出来的内存

5. 网络socket连接


 C++中有智能指针,比如shared_ptr,可以自动释放指针指向的资源。

这里不详细说shared_ptr用法。

而是自己实现一个以对象管理资源的例子


例子:线程互斥锁的加锁、解锁。

1. 利用对象到构造函数,析构函数来自动完成加锁、解锁。将编译器默认提供的无用函数禁用掉。

1 class MutexLock{ 2 public: 3     explicit MutexLock(pthread_mutex_t *_lock):lock_obj(_lock){ 4         pthread_mutex_lock(lock_obj); 5     }    6  7     ~MutexLock(){ 8         pthread_mutex_unlock(lock_obj); 9     }   10     11 private:12     pthread_mutex_t * const lock_obj;13     //No copying allowed14     MutexLock(const MutexLock&);15     void operator=(const MutexLock&);   16 };

2. 线程执行函数

1 void *add(void* args){ 2     sleep(1); 3     for(int i = 0; i < TASK_CNT; ++i){ 4         /*   5         //显示加锁, 解锁 6         pthread_mutex_lock(&lock); 7         g_num++; 8         //如果return, break, 则不能释放锁 9         pthread_mutex_unlock(&lock);10         */11 12         //使用构造函数加锁, 析构函数解锁13         MutexLock mu_lock(&lock);14         g_num++;15     }   16     pthread_exit(NULL);17 }

3. 整体代码

1 #include 
2 #include
3 4 int g_num = 0; 5 const int THREAD_CNT = 4; 6 const int TASK_CNT = 10000000; 7 pthread_mutex_t lock; 8 9 class MutexLock{10 public:11 explicit MutexLock(pthread_mutex_t *_lock):lock_obj(_lock){12 pthread_mutex_lock(lock_obj);13 } 14 15 ~MutexLock(){16 pthread_mutex_unlock(lock_obj);17 } 18 19 private:20 pthread_mutex_t * const lock_obj;21 //No copying allowed22 MutexLock(const MutexLock&);23 void operator=(const MutexLock&); 24 };25 26 void *add(void* args){27 sleep(1);28 for(int i = 0; i < TASK_CNT; ++i){29 /* 30 //显示加锁, 解锁31 pthread_mutex_lock(&lock);32 g_num++;33 //如果return, break, 则不能释放锁34 pthread_mutex_unlock(&lock);35 */36 37 //使用构造函数加锁, 析构函数解锁38 MutexLock mu_lock(&lock);39 g_num++;40 } 41 pthread_exit(NULL);42 }43 44 int main(){45 pthread_t pid[THREAD_CNT];46 47 pthread_mutex_init(&lock, NULL);48 for(int i = 0; i < THREAD_CNT; ++i){49 pthread_create(&pid[i], NULL, add, NULL);50 }51 52 for(int i = 0; i < THREAD_CNT; ++i){53 pthread_join(pid[i],NULL);54 }55 56 std::cout << "g_num = " << g_num << std::endl;57 return 0;58 }
View Code

 

c++智能指针可以参考网上的例子:

http://www.cnblogs.com/lanxuezaipiao/p/4132096.html

你可能感兴趣的文章
将jar文件转换成exe可执行文件
查看>>
linux下几个关机、重启的命令
查看>>
MySQL 的slave_exec_mode参数的用处
查看>>
《近距离探索memcache缓存》学习笔记
查看>>
解决SSH会话连接超时问题
查看>>
一条命令搞垮MongoDB实例
查看>>
netbackup基础知识
查看>>
个人信息保护大势所趋 勿待重创之下方出细典
查看>>
MJRefresh的运用
查看>>
mysql的一个坑
查看>>
java 帮助类
查看>>
Ubuntu使用Evernote
查看>>
Windows Server 2003 R2(x64)迁移到Windows Server 2008 R2
查看>>
美啦是如何抓住“她经济”一“美”而起
查看>>
我的友情链接
查看>>
snort中PV结构体详解
查看>>
手把手教你玩转阿里云双11拼团活动
查看>>
数据恢复软件视频教程-D-Recovery Standard(分区表部分)
查看>>
我的友情链接
查看>>
十六周四次课
查看>>