多线程中的C ++ Singleton

时间:2014-10-20 18:12:46

标签: c++ multithreading qt

我是多线程编程的新手,但我正在研究其他人的大项目。在代码中,他有一个单例类,它有一些公共成员变量和一个成员互斥。他在不同的主题中使用过这个单身人士,如:

singleton::instance()->mutex.lock();
singleton::instance()->value = getval();
singleton::instance()->mutex.release();

这是安全的方法吗? 如果不是在单例中读取/写入值的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

不这样做是不安全的。

问题是互斥锁是分发给用户的。无法保证此锁定将被释放。例如,如果getval()会抛出异常会发生什么?

这样做的正确方法是在你的单身人士的API中嵌入互斥使用。例如:

void singleton::setvalue(int val) {  // example supposing value is an int
    std::lock_guard<std::mutex> mylck (mutex);
    value = val; 
    } 

在此示例中,使用了本地std::lock_guard。此对象锁定互斥锁并在销毁时将其解锁。这确保了在任何情况下,只要函数返回并且即使抛出异常,互斥锁也将被解锁。

答案 1 :(得分:1)

注意:如果您所做的只是获取return variable;之类的变量,那么即使没有锁也可以安全地进行。

关于代码。假设锁被正确实现,那么在调用release之前做任何事都是安全的