在libstdc++中,<iostream> header 定义了ios_base::Init的一个实例,它的构造函数原子地增加了一个计数器,如果计数器为0,则初始化cin/cout/cerr。这保证cin/cout/cerr总是在#include <iostream>之后,在每个TU中初始化。
我希望实现一个具有与ios_base::Init相同行为的初始化器,也就是说,我希望确保在包含一些头之前,在将其用于另一个全局变量的构造函数之前,会立即初始化一些全局对象。但是,这需要使用原子操作。libstdc++使用GCC的扩展,这是不标准的:init.cc?view=markup
根据如何有效地使用std::原子,std::是执行原子操作的唯一标准方法,所以我需要在所有TU中的初始化器之前构造一个全局原子变量。要初始化它,我需要另一个初始化器来初始化它,以此类推,可悲的是,我需要进行无限递归。
所以我的问题是,什么是最好的,标准的方法?
发布于 2012-05-09 18:24:22
标准原子变量有常量表达式构造函数,这意味着它们在静态初始化阶段(即编译时)被初始化。因此,使用std::atomic<int>之类的东西作为您的计数器是没有问题的。
也就是说,如果您的程序在main启动之前没有启动任何线程,那么您可能就不必担心这个问题了。
顺便说一下,您所描述的结构也称为漂亮计数器或Schwarz计数器。
https://stackoverflow.com/questions/10521263
复制相似问题