代码之家  ›  专栏  ›  技术社区  ›  Jeremy Friesner

函数中的静态对象是否引入了潜在的竞争条件?

  •  0
  • Jeremy Friesner  · 技术社区  · 16 年前

    我对以下代码很好奇:

    class MyClass
    {
    public:
       MyClass() : _myArray(new int[1024]) {}
       ~MyClass() {delete [] _myArray;}
    
    private:
       int * _myArray;
    };
    
    // This function may be called by different threads in an unsynchronized manner
    void MyFunction()
    {
       static const MyClass _myClassObject;
       [...]
    }
    

    void MyFunction()
    {
       static bool _myClassObjectInitialized = false;
       if (_myClassObjectInitialized == false)
       {
          _myClassObjectInitialized = true;
          _myClassObject.MyClass();   // call constructor to set up object
       }
       [...]
    }
    

    ... 在这种情况下,如果两个线程几乎同时调用MyFunction(),那么\u myArray可能会被分配两次,从而导致内存泄漏?

    或者这是正确的处理方式?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Puppy    16 年前

    那里绝对有可能出现比赛情况。是否真的有一个是相当他妈的不确定。你不应该在单线程的情况下使用这样的代码,因为这是一个糟糕的设计,但它可能是你的应用程序在多线程的死亡。任何像这样的静态常量都应该放在一个方便的名称空间中,并在应用程序开始时分配。

        2
  •  0
  •   Matt S    16 年前

    推荐文章