多线程中的C++ Singleton

Nya*_*uko -2 c++ qt multithreading

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

singleton::instance()->mutex.lock();
singleton::instance()->value = getval();
singleton::instance()->mutex.release();
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*phe 5

不这样做是不安全的.

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

这样做的正确方法是在你的单例的API中嵌入互斥量.例如:

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

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