gpt4 book ai didi

c++ - 全局变量构造函数/析构函数是否需要线程保护?

转载 作者:行者123 更新时间:2023-11-30 01:57:51 27 4
gpt4 key购买 nike

如果我有一个类,其唯一目的是拥有全局 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需要保护,或者此代码不可能从多个线程运行,因为线程只会创建一次 mainmain 之前运行并销毁返回?

最佳答案

首先,我不认为 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com