热度 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)的析构函数, 这样我们只需要关心程序的功能就好啦~