C++ 以对象管理资源

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. 整体代码

C++ 以对象管理资源C++ 以对象管理资源
 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

上一篇:iOS 关联对象


下一篇:解决 asp.net 伪静态 IIS设置后 直正HTML无法显示的问题