Gra*_*Lee 1 c++ multithreading mutex thread-safety
std :: mutex是多线程的成员变量线程安全吗?
有一个类的实例有一个变量和互斥锁作为成员.
每个函数都在不同的线程中调用.
我很好奇,可以使用这样的互斥量吗?
有许多示例代码使用一种包装类来保护互联网,如卫士或其他东西.
我更喜欢简单地使用它,并希望明确解锁.不是在破坏时间.
#include <mutex>
#include <stdio.h>
class A {
private:
bool _is;
std::mutex _mutex;
}
// this function runs in Thread A
void A::read() {
_mutex.lock();
printf("%d", _is);
_mutex.unlock();
}
// this function runs in Thread B
void A::write() {
_mutex.lock();
printf("%d", _is);
_is = !_is;
_mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud)
它基本上可以工作,但有几个"陷阱"你需要注意:
如果lock()和unlock()调用之间的代码抛出异常(或使用return或goto关键字),则unlock()可能永远不会达到调用,因此您的互斥锁将无限期地保持锁定状态.这可能会导致应用程序死锁,因为尝试锁定互斥锁的每个后续线程都将永远等待自己的lock()返回调用.(如果您使用lock_guard/RAII方法,这种危险就会消失,这就是推荐/更安全的方法)
如果A对象在其他线程仍然可以访问时被删除,则可能会导致未定义的行为,因为线程所依赖的成员变量mutex将被销毁.(为了避免这种情况的典型方法是确保所有线程都被join()倒是之前,他们所依赖的破坏的互斥-或通过移动互斥出来的对象,并为一些更高级别的对象就可以保证不会在线程仍在运行时被破坏)