如何知道main()是否正在运行?

时间:2016-03-17 09:58:38

标签: c++ c++03

上下文: 在我的应用程序中,我有一些使用全局变量的函数。由于全局变量的分配顺序未定义,我想在main函数运行之前禁止调用这些函数。目前,我只在Doxygen中用\attention记录它,但我想添加一个断言。

我的问题: 是否有一种优雅的方式可以知道main函数尚未运行?

示例(uniqid.cpp):

#include <boost/thread.hpp>
#include <cassert>
unsigned long int uid = 0;
boost::mutex uniqid_mutex;
unsigned long int uniquid()
{
  assert(main_is_running() && "Forbidden call before main is running");
  boost::mutex::scoped_lock lock(uniqid_mutex);
  return ++uid;
}

我的第一个(丑陋的)想法: 我的第一个想法是通过检查具有特定值的另一个全局变量。那么在初始化之前在变量中具有该值的概率非常小:

// File main_is_running.h
void launch_main();
bool main_is_running();

// File main_is_running.cpp
unsigned long int main_is_running_check_value = 0;
void launch_main()
{
  main_is_running_check_value = 135798642;
}
bool main_is_running()
{
  return (main_is_running_check_value == 135798642);
}

// File main.cpp
#include "main_is_running.h"
int main()
{
  launch_main();
  // ...
  return 0;
}

有更好的方法吗?

请注意,我无法使用C ++ 11 ,因为我必须与gcc 4.1.2兼容。

1 个答案:

答案 0 :(得分:1)

如果定义了static std::atomic<bool> s;,还有一点切换struct

struct toggle
{
    toggle(std::atomic<bool>& b) : m_b(b)
    {
        m_b = true;
    }   
    ~toggle()
    {
        m_b = false;
    }
    std::atomic<bool>& m_b;
};

然后,在main中,将toggle t(s);写为第一个语句。这是将引用作为成员变量的一个例子之一。

s可以告诉您是否在main。鉴于std::atomic调用自身的行为在C ++中是 undefined ,使用main可能是过度的。如果你没有C ++ 11,那么volatile bool就足够了:有效你的main不在NaN之前。