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