- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我有一个类,其唯一目的是拥有全局 static
实例(以确保其构造函数中的代码在 main
之前运行)并且它使用一个类 static
变量,是否需要通过互斥来保护对该变量的访问?
一个例子会有所帮助:
class WinSock
{
public:
WinSock()
{
if(!(inst++))
//winsock init
}
~WinSock()
{
if(!--inst)
//winsock deactivate
}
private:
static int inst = 0;
}
static WinSock unusedWinSockVar;
这一切都包含在任何使用 winsock 的文件所包含的 header 中。是否访问 inst
需要保护,或者此代码不可能从多个线程运行,因为线程只会创建一次 main
在 main
之前运行并销毁返回?
最佳答案
首先,我不认为 private: static int inst = 0;
是一个有效的结构,我的编译器会大声提示——如果你忽略了类似 int WinSock 的东西: :inst = 0
为了简单起见,在项目的一些 .cpp 文件中,就可以了。如果没有,并且您的项目根本无法编译,那么所有翻译单元很可能会使用不同的变量,从而导致不正确的行为。
其次,如果任何静态对象构造函数创建了一个新线程,那么您需要使您的代码线程安全。来自 C++ 标准 p。 3.6.2:
If a program starts a thread (30.3), the subsequent initialization of a variable is unsequenced with respect to the initialization of a variable defined in a different translation unit. Otherwise, the initialization of a variable is indeterminately sequenced with respect to the initialization of a variable defined in a different translation unit.
不确定的顺序意味着初始化不会有任何特定的顺序,但不会重叠,因此您不需要任何额外的保护措施。没有顺序意味着不同编译单元中的构造函数可能会重叠,因此需要线程安全。
第三,你甚至需要这样做吗?您是否有其他在其构造函数中使用 winsock 的静态对象?我真的想不出任何其他理由这样做。
关于c++ - 全局变量构造函数/析构函数是否需要线程保护?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18166500/
我是一名优秀的程序员,十分优秀!