c++ - std::mutex 作为多线程的成员变量线程安全吗?

标签 c++ multithreading thread-safety mutex

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

有一个类的实例有一个变量和互斥锁作为成员。

每个函数在不同的线程中调用。

我很好奇可以这样使用互斥量吗?

有很多示例代码使用一种包装类来互斥,例如 guard 或其他东西。

我更喜欢简单地使用它并且想要显式解锁。不在破坏时间。

#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();
}

最佳答案

它基本上可以工作,但您需要注意几个“陷阱”:

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

  2. 如果 A 对象在其他线程仍可访问时被删除,它可能会导致未定义的行为,因为线程依赖于序列化的成员变量互斥量将已被摧毁。 (避免这种情况的典型方法是确保所有线程在它们所依赖的互斥量被破坏之前join()——或者通过将互斥量移出对象和一些更高级别的对象,你可以保证在线程仍在运行时不会被破坏)

关于c++ - std::mutex 作为多线程的成员变量线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51372861/

相关文章:

c++ - 计算步数的基本情况背后的直觉

python - 错误 : variable has incomplete type 'void'

c++ - 如何以及为什么可以更改成员的访问级别?

c++ - _begintheadex函数调用问题

c# - C#中的多线程队列

c - 线程同步

c++ - 线程安全的 std::cout

android - 为什么这不会导致崩溃?我正在从其他线程更新 UI

c++ - 关于简单游戏中人工智能的想法(例如 : Tic Tac Toe) C++

c# - Windows 服务内部轮询的常见做法