原创 如何使用smart pointer管理mutex

2016-5-17 22:37 938 17 17 分类: MCU/ 嵌入式 文集: Qt和Cpp
在设计多线程程序时,有时候,我们需要使用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条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /2 下一条