C++ 中的互斥量,全局变量还是在每个 class 中私有定义?
Mutex in C++, global variable or privately defined inside each class?
在 C++ 中尝试从多个线程访问 class 的共享实例时,我想到了两种方法:
1) 通过调用 lock_guard.
使用全局互斥锁从线程访问通过引用传递的对象实例
2) 在 class 中创建一个互斥量作为私有变量,并在 class lock_guard 的每个成员内部调用当试图同时访问 class.
那么,哪种方法更合适,为什么?
我觉得使用互斥锁作为成员更舒服。
- 基本上互斥锁属于资源,它可以保护对它的多次访问。由于资源属于 class,因此保护互斥锁也属于 class。所以使用互斥锁作为私有成员更适合实现私有锁功能。
- 此外,我建议永远不要使用全局变量,除非你有一个非常非常好的理由,尽管它真的很长。
我正要强调#2(互斥作为 class 的成员)。但后来有时间反思。
他们都是有生命力的,也有他们的目的。
选项 1 基本上是说 class 的实例不是线程安全的,需要线程同步访问。 std:: 命名空间中的大多数 C++ 集合 class 就是这种情况(例如 vector、map 等……)
选项 2 基本上是说,"instances of this class are thread safe"。
对于代表数据对象的 classes(例如 "Point"、"Matrix" "ApplicationSettings" 或任何具有成员函数的 class,我个人更喜欢 #1即 getter/setters)。或者其生命周期由其他 class 管理。或者,如果主要意图是 class 实例一次仅供单个线程使用。或者换一种说法,简单 classes.
选项 #2(互斥锁作为成员)是当 class 对象提供的服务旨在对多个(可能 不相关的 )线程有用时间。例如,为整个应用程序而存在的数据库、日志记录服务或消息队列对象。或者当对象将要从另一个线程上的另一个对象接收消息时。
在 C++ 中尝试从多个线程访问 class 的共享实例时,我想到了两种方法:
1) 通过调用 lock_guard.
使用全局互斥锁从线程访问通过引用传递的对象实例2) 在 class 中创建一个互斥量作为私有变量,并在 class lock_guard 的每个成员内部调用当试图同时访问 class.
那么,哪种方法更合适,为什么?
我觉得使用互斥锁作为成员更舒服。
- 基本上互斥锁属于资源,它可以保护对它的多次访问。由于资源属于 class,因此保护互斥锁也属于 class。所以使用互斥锁作为私有成员更适合实现私有锁功能。
- 此外,我建议永远不要使用全局变量,除非你有一个非常非常好的理由,尽管它真的很长。
我正要强调#2(互斥作为 class 的成员)。但后来有时间反思。
他们都是有生命力的,也有他们的目的。
选项 1 基本上是说 class 的实例不是线程安全的,需要线程同步访问。 std:: 命名空间中的大多数 C++ 集合 class 就是这种情况(例如 vector、map 等……)
选项 2 基本上是说,"instances of this class are thread safe"。
对于代表数据对象的 classes(例如 "Point"、"Matrix" "ApplicationSettings" 或任何具有成员函数的 class,我个人更喜欢 #1即 getter/setters)。或者其生命周期由其他 class 管理。或者,如果主要意图是 class 实例一次仅供单个线程使用。或者换一种说法,简单 classes.
选项 #2(互斥锁作为成员)是当 class 对象提供的服务旨在对多个(可能 不相关的 )线程有用时间。例如,为整个应用程序而存在的数据库、日志记录服务或消息队列对象。或者当对象将要从另一个线程上的另一个对象接收消息时。