原创
如何使用smart pointer管理mutex
在设计多线程程序时,有时候,我们需要使用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)的析构函数,
这样我们只需要关心程序的功能就好啦~
文章评论(0条评论)
登录后参与讨论