【问题标题】:How to make multiple instances of global variables in C++如何在 C++ 中创建多个全局变量实例
【发布时间】:2015-09-20 06:04:39
【问题描述】:

问题标题可能很难理解,但这里是我的问题更详细一点:

我是 C++ 新手,正在制作一个使用全局变量更简单的程序。 (我知道它们通常很糟糕,但我敢肯定任何替代方案都更糟。)我知道有很多方法可以制作诸如全局变量之类的东西。我的问题是这个程序的一个特点是,在某些情况下,(几乎)整个程序可以有多个线程在运行。这些线程中的每一个都需要它们自己的这些全局变量的实例。所以,我的问题是,我需要做什么类型的事情来创建某种类型的全局变量,我可以创建多个实例?我不在乎它会如何制作。我希望所有的全局变量在它们的名字中都是全局的(类似于命名空间),以防止名字的意外冲突,但这不是必需的。

我曾考虑过使用一个类的实例来存储所有值,但我想不出一种简单的方法来让所有不同的文件/函数都可以轻松访问它。

提前致谢!

【问题讨论】:

  • 不要使用全局变量。
  • 真的没有。当您是新手时,请摆脱这种心态
  • 我对编程并不陌生;我已经编程好几年了。我最近才决定最终咬住 C++ 子弹。

标签: c++


【解决方案1】:

您应该能够为此使用本地线程,每个线程都有自己的实例。

thread_local int foo = 0;

https://en.wikipedia.org/wiki/Thread-local_storage#C_and_C.2B.2B

【讨论】:

    【解决方案2】:

    你可以有一个具有多个实例函数的单例:

    struct GlobalVariables {
      int var1;
      int var2;
      static GlobalVariables& instance1(){
        static GlobalVariables instance;
        return instance
      }
      static GlobalVariables& instance2(){
        static GlobalVariables instance;
        return instance
      }
    };
    
    int main(){
      auto& vars1 = GlobalVariables::instance1();
      vars1.var1 = 42;
    } 
    

    【讨论】:

      【解决方案3】:

      也许您可以考虑为每个全局变量使用映射结构,其中线程 ID 将用作键。

      例如,如果您希望每个线程都有自己的实例:

      int foo
      

      那么您可以创建一个地图,而不是创建上述全局“foo”:

      map<size_t, int> foo
      

      每个线程都会像这样写入 foo 的“它自己的实例”:

      foo[std::this_thread::get_id().hash()] = foo_value_for_this_thread 
      

      这样读:

      foo_value_for_this_thread = foo[std::this_thread::get_id().hash()]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-23
        • 2018-09-27
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 1970-01-01
        相关资源
        最近更新 更多