在具有许多类的 C++ 多线程应用程序中,我试图找出定义全局变量的方法
C 风格,在任何一个源文件中将其定义为全局,在标题中将其定义为外部,该标题包含在访问此变量的类中。
编写一个 Singleton 类,其中包含这些全局变量并公开 set/get 方法以写入变量。
通过第二种方法,可以通过锁以集中方式控制多线程访问,而不是第一种方法。
有更多更好的方法吗?
在具有许多类的 C++ 多线程应用程序中,我试图找出定义全局变量的方法
C 风格,在任何一个源文件中将其定义为全局,在标题中将其定义为外部,该标题包含在访问此变量的类中。
编写一个 Singleton 类,其中包含这些全局变量并公开 set/get 方法以写入变量。
通过第二种方法,可以通过锁以集中方式控制多线程访问,而不是第一种方法。
有更多更好的方法吗?
首先尽量避免使用全局变量。如果您只需要这样做(例如,这是cin
,cout
和的情况cerr
),那么您的第二种方法绝对是最好的(也是更自然的)方法。
我肯定会选择 Singleton 课程。这是在多线程 OOP 环境中处理“全局”变量的最佳方式。
如果可以缩小“全局变量”的范围(通常是这种情况 - 有多少变量是真正的全局变量?),那么您可以将其设为相应所属类中的私有静态类成员。如果您的其他类需要查看它(或者不太可能,更新它),请提供 get/put 访问器。
如果您必须使用全局变量(为什么要使用一个?)我推荐您描述的第二种方式。第一种方式是您可能会遇到各种命名空间问题的方式。
这个问题可以很容易地用另一种方法解决。
C++ 通过它的新操作符::称为范围解析操作符很容易地解决了这个问题。语法如下
:: variable-name;
此运算符允许访问变量的全局版本。
人们倾向于选择第二种方法,因为它似乎可以为您提供更好的控制,但在某些情况下它可能不是很有用。
首先,在我对 OOP 哲学的理解中,我不将对象视为一堆数据的集合,而是将实体视为可以代表现实世界问题的实体。所以我不认为有一个类来存储随机数据是个好主意。特别是当数据成员在很大程度上不相关时。
其次,如果您正在考虑进行中央控制,例如。使用单个互斥锁来访问所有数据成员,这对于不相关的数据成员来说效果不佳。您将不必要地阻塞许多线程,而他们想要的数据并不完全是当前受锁保护的数据。
所以它可能看起来很奇怪,但我更喜欢第一种方法。
不要踢死马,但如前所述,避免全局变量是最好的解决方案。这里列出了一些原因。如果全局变量是必须的,您可能需要考虑提供一个函数来访问它,以避免所谓的“全局初始化失败”。
这取决于手头的问题。
C 风格的全局变量具有简单的优点,不需要 Singleton::instance() 调用。但是, Singleton::instance() 允许您在第一次调用时初始化全局状态。
为了两全其美,请使用使用 Schwarz Counter 方法初始化的 C 样式全局变量。http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter
您可以定义一个值对象,该对象使用句柄/正文习语包装单个实现。
还可以查看 Alexandrescu 的“Modern C++ Design”,讨论在 MT 环境中实现单例的困难以及如何解决这些困难。