C++ 以对象管理资源

简介: C++中使用到的资源可能很多,并且一些资源获取后还必须释放归还给系统, 列举几个如:1. 打开的文件句柄2. 数据库连接3. 互斥锁4. 动态分配new出来的内存5. 网络socket连接 C++中有智能指针,比如shared_ptr,可以自动释放指针指向的资源。

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 allowed
14     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 <pthread.h>
 2 #include <iostream>
 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 allowed
22     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

相关文章
|
4天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
19 0
|
29天前
|
存储 编译器 C语言
C++入门: 类和对象笔记总结(上)
C++入门: 类和对象笔记总结(上)
34 0
|
1月前
|
存储 JSON 安全
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
【C++ JSON库 json值的创建手段】深入探究C++中JSON对象定位与操作:从引用到回调函数
66 0
|
4天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
19 0
|
3天前
|
编译器 C++
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
|
9天前
|
编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
|
9天前
|
存储 编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
|
10天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
10天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
|
16天前
|
存储 编译器 C语言
C++类与对象
C++类与对象
16 0