tag 标签: smart-pointer

相关博文
  • 热度 17
    2016-5-17 22:37
    946 次阅读|
    0 个评论
    在设计多线程程序时,有时候,我们需要使用mutex来保护数据的读写访问。 mutex需要被创建和销毁: int pthread_mutex_init(pthread_mutex_t *restrict mutex,     const pthread_mutexattr_t *restrict attr); int pthread_mutex_destroy(pthread_mutex_t *mutex); 与其使用plain pointer来管理mutex,不如使用smart pointer。 smart pointer能够自动销毁资源。 1. 假如我们需要动态申请的资源是一个结构体: class foo { public:     int count;     int id;     pthread_mutex_t lock;     ~foo(); }; 为它设置一个全局smart pointer: shared_ptr foo_sp; 2. 在主函数中动态申请空间,返回smart pointer,并初始化mutex: foo_sp = make_shared(); if (!foo_sp) {     cerr "Error: make_shared failed." endl;     return -1; } if (pthread_mutex_init(foo_sp-lock, NULL)) {     cerr "Error: Cannot init mutex." endl;     return -1; } 3. 在class foo的析构函数中添加如下语句: foo::~foo() {     int flag = pthread_mutex_destroy(lock);     cout "(~foo)pthread_mutex_destroy = " flag endl; } 4. 使用mutex时,在相应的位置加锁/解锁即可,比如在新建的线程里: void *ntid_print(void *arg) {     pthread_mutex_lock(foo_sp-lock);     foo_sp-count++;     pthread_mutex_unlock(foo_sp-lock);     return ((void *)0); } 使用smart pointer管理mutex的好处是,我们不需要自己来处理动态内存的申请和销毁。 当主程序运行结束时,会销毁smart pointer, 此时smart pointer的析构函数会被调用,而此析构函数会调用其对象(foo)的析构函数, 这样我们只需要关心程序的功能就好啦~