我对以下代码感到好奇:
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可能会被分配两次,导致内存泄漏?
或者这是否以某种方式正确处理?
答案 0 :(得分:1)
那里绝对存在竞争条件。是否真的有一个是非常的未定义。你不应该在单线程场景中使用这样的代码,因为它是糟糕的设计,但它可能是你的应用程序在多线程中死亡。任何像这样的静态const应该放在一个方便的命名空间中,并在应用程序的开头分配。
答案 1 :(得分:0)
如果您使用多个线程,请使用信号量,这就是它们的用途。