0

我很好奇以下代码:

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(),那么 _myArray 可能会被分配两次,从而导致内存泄漏?

还是以某种方式正确处理?

4

2 回答 2

1

那里绝对有可能的竞争条件。是否真的有一个是非常该死的不确定。你不应该在单线程场景中使用这样的代码,因为它的设计很糟糕,但它可能会导致你的应用程序在多线程中死亡。任何像这样的静态 const 都应该放在一个方便的命名空间中,并在应用程序开始时分配。

于 2010-05-30T17:14:48.183 回答
0

如果您使用多个线程,请使用信号量,这就是它们的用途。

于 2010-05-30T17:14:42.177 回答