5

在具有许多类的 C++ 多线程应用程序中,我试图找出定义全局变量的方法

  1. C 风格,在任何一个源文件中将其定义为全局,在标题中将其定义为外部,该标题包含在访问此变量的类中。

  2. 编写一个 Singleton 类,其中包含这些全局变量并公开 set/get 方法以写入变量。

通过第二种方法,可以通过锁以集中方式控制多线程访问,而不是第一种方法。

有更多更好的方法吗?

4

9 回答 9

4

首先尽量避免使用全局变量。如果您只需要这样做(例如,这是cin,cout和的情况cerr),那么您的第二种方法绝对是最好的(也是更自然的)方法。

于 2010-08-25T16:09:06.963 回答
3

我肯定会选择 Singleton 课程。这是在多线程 OOP 环境中处理“全局”变量的最佳方式。

于 2010-08-25T16:04:38.407 回答
3

如果可以缩小“全局变量”的范围(通常是这种情况 - 有多少变量是真正的全局变量?),那么您可以将其设为相应所属类中的私有静态类成员。如果您的其他类需要查看它(或者不太可能,更新它),请提供 get/put 访问器。

于 2010-08-25T16:17:48.860 回答
1

如果您必须使用全局变量(为什么要使用一个?)我推荐您描述的第二种方式。第一种方式是您可能会遇到各种命名空间问题的方式。

于 2010-08-25T16:05:47.403 回答
1

这个问题可以很容易地用另一种方法解决。

C++ 通过它的新操作符::称为范围解析操作符很容易地解决了这个问题。语法如下

:: variable-name;

此运算符允许访问变量的全局版本。

于 2010-08-25T16:24:01.107 回答
1

人们倾向于选择第二种方法,因为它似乎可以为您提供更好的控制,但在某些情况下它可能不是很有用。

首先,在我对 OOP 哲学的理解中,我不将对象视为一堆数据的集合,而是将实体视为可以代表现实世界问题的实体。所以我不认为有一个类来存储随机数据是个好主意。特别是当数据成员在很大程度上不相关时。

其次,如果您正在考虑进行中央控制,例如。使用单个互斥锁来访问所有数据成员,这对于不相关的数据成员来说效果不佳。您将不必要地阻塞许多线程,而他们想要的数据并不完全是当前受锁保护的数据。

所以它可能看起来很奇怪,但我更喜欢第一种方法。

于 2010-08-26T11:22:07.273 回答
0

不要踢死马,但如前所述,避免全局变量是最好的解决方案。这里列出了一些原因。如果全局变量是必须的,您可能需要考虑提供一个函数来访问它,以避免所谓的“全局初始化失败”。

于 2010-08-26T04:02:47.767 回答
0

这取决于手头的问题。

C 风格的全局变量具有简单的优点,不需要 Singleton::instance() 调用。但是, Singleton::instance() 允许您在第一次调用时初始化全局状态。

为了两全其美,请使用使用 Schwarz Counter 方法初始化的 C 样式全局变量。http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter

于 2010-08-25T16:16:19.713 回答
0

您可以定义一个值对象,该对象使用句柄/正文习语包装单个实现。

还可以查看 Alexandrescu 的“Modern C++ Design”,讨论在 MT 环境中实现单例的困难以及如何解决这些困难。

于 2010-08-25T16:19:17.243 回答