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 }
c++智能指针可以参考网上的例子:
http://www.cnblogs.com/lanxuezaipiao/p/4132096.html