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

     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

  • 相关阅读:
    由12306.cn谈谈网站性能技术 岁月无情
    雅虎网站页面性能优化的34条黄金守则 岁月无情
    [纯技术讨论]从12306谈海量事务高速处理系统 岁月无情
    解密淘宝网的开源架构(转) 岁月无情
    HttpCombiner.ashx处理 岁月无情
    转 自定义控件属性的特性大全 岁月无情
    模式窗口window.showModal 岁月无情
    动态加载JSashx的妙用 岁月无情
    ASP.NET中Get和Post的用法 岁月无情
    初学Oracle的笔记(1)——基础内容(实时更新中..)
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/6736783.html
Copyright © 2020-2023  润新知