2

在 libstdc++ 中,<iostream>header定义了 的实例ios_base::Init,其构造函数原子地增加一个计数器并在计数器为 0 时初始化 cin/cout/cerr。这保证了 cin/cout/cerr 总是#include <iostream>在每个 TU 之后初始化。

我想实现一个具有与 相同行为的初始化程序ios_base::Init,即我想保证我的一些全局对象在包含一些标头后立即初始化,然后再用于另一个全局变量的构造函数。但是,这需要使用原子操作。libstdc++ 使用 GCC 的扩展,这不是标准的:http ://gcc.gnu.org/viewcvs/trunk/libstdc%2B%2B-v3/src/c%2B%2B98/ios_init.cc?view=markup

根据How to use std::atomic Effective,std::atomic 是进行原子操作的唯一标准方法,所以我需要在所有 TU 的初始化程序之前构造一个全局原子变量。要初始化它,我需要另一个初始化器来初始化它,依此类推,遗憾的是,进行了一些无限递归。

所以我的问题是,最好的标准方法是什么?

4

1 回答 1

0

标准原子变量具有常量表达式构造函数,这意味着它们在静态初始化阶段(即编译时)被初始化。std::atomic<int>因此,使用类似 an作为计数器没有问题。

也就是说,如果您的程序在启动之前没有启动任何线程main,那么您可能不必为此担心太多。

顺便说一句,你描述的结构也被称为漂亮的柜台或施瓦茨柜台。

于 2012-05-09T18:24:22.723 回答