繁体   English   中英

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

[英]Is std::mutex as a member variable thread-safe for multiple threads?

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对象在仍可被其他线程访问的同时被删除,则可能会导致不确定的行为,因为线程所依赖的member-variable-mutex序列化将被销毁。 (避免这种情况的典型方法是,在销毁它们所依赖的互斥对象之前 ,确保所有线程都已经被join() '了-或通过将互斥对象移出对象并移入可以保证的更高级别的对象中在线程仍在运行时不会被破坏)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM