std :: mutex是多线程的成员变量线程安全吗?

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)

Jer*_*ner 6

它基本上可以工作,但有几个"陷阱"你需要注意:

  1. 如果lock()unlock()调用之间的代码抛出异常(或使用returngoto关键字),则unlock()可能永远不会达到调用,因此您的互斥锁将无限期地保持锁定状态.这可能会导致应用程序死锁,因为尝试锁定互斥锁的每个后续线程都将永远等待自己的lock()返回调用.(如果您使用lock_guard/RAII方法,这种危险就会消失,这就是推荐/更安全的方法)

  2. 如果A对象在其他线程仍然可以访问时被删除,则可能会导致未定义的行为,因为线程所依赖的成员变量mutex将被销毁.(为了避免这种情况的典型方法是确保所有线程都被join()倒是之前,他们所依赖的破坏的互斥-或通过移动互斥出来的对象,并为一些更高级别的对象就可以保证不会在线程仍在运行时被破坏)