C++ C+中的互斥体+;,全局变量还是在每个类内部私有定义的?

C++ C+中的互斥体+;,全局变量还是在每个类内部私有定义的?,c++,multithreading,mutex,C++,Multithreading,Mutex,在尝试从多个线程访问C++中类的共享实例时,我遇到了两种方法: 1) 通过调用lock\u guard,使用全局互斥体从线程访问引用传递的对象实例 2) 在类中创建一个互斥体作为私有变量,并在试图同时访问类中的某个变量时在该类的每个成员内部调用lock\u guard 那么,哪种方法更合适?为什么?我觉得使用互斥体作为成员更合适 基本上,互斥锁属于资源,它保护对该资源的多重访问。由于资源属于该类,所以保护互斥体也属于该类。因此,为了实现私有锁功能,更适合将互斥体用作私有成员 另外,我建议永远不

在尝试从多个线程访问C++中类的共享实例时,我遇到了两种方法:

1) 通过调用lock\u guard,使用全局互斥体从线程访问引用传递的对象实例

2) 在类中创建一个互斥体作为私有变量,并在试图同时访问类中的某个变量时在该类的每个成员内部调用lock\u guard


那么,哪种方法更合适?为什么?

我觉得使用互斥体作为成员更合适

  • 基本上,互斥锁属于资源,它保护对该资源的多重访问。由于资源属于该类,所以保护互斥体也属于该类。因此,为了实现私有锁功能,更适合将互斥体用作私有成员
  • 另外,我建议永远不要使用全局变量,除非你有一个很好的理由,尽管这个理由很长

我正要强调说#2(作为类成员的互斥)。但后来有一段时间来反思

它们都是可行的,都有自己的目的。

选项1基本上是说类的实例不是线程安全的,需要线程同步访问。在STD::命名空间(例如向量、地图等)

中,大多数C++集合类就是这样的情况。 选项2基本上是说,“这个类的实例是线程安全的”

我个人更喜欢用#1表示表示数据对象的类(例如,“点”、“矩阵”、“应用程序设置”或任何具有作为getter/setter的成员函数的类)。或者有一个由其他类管理的生命周期。或者,如果主要目的是类实例一次只由一个线程使用。或者换句话说,简单的类


选项#2(互斥体作为成员)是指类对象提供的服务旨在一次对多个(可能不相关的)线程有用。例如,为整个应用程序存在的数据库、日志记录服务或消息队列对象。或者当对象将从另一个线程上的另一个对象接收消息时。

因此,您应该锁定可以同时访问的变量,而不是对象实例本身,对吗?例如,如果我执行std::cout,我是否会遇到任何并发问题?如果我理解您的意思是正确的,是的。您应该锁定,访问并发服务器有什么问题。对象本身可能不是并发性的问题。在许多情况下,只有成员变量才是问题所在。您希望有一个安全的访问权限。这就是我所能说的,不知道你的问题=)两者都做不同的事情。