我是多线程编程的新手,但我正在研究其他人的大项目。在代码中,他有一个单例类,它有一些公共成员变量和一个成员互斥。他在不同的主题中使用过这个单身人士,如:
singleton::instance()->mutex.lock();
singleton::instance()->value = getval();
singleton::instance()->mutex.release();
这是安全的方法吗? 如果不是在单例中读取/写入值的正确方法是什么?
答案 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之前做任何事都是安全的