簡體   English   中英

函數中的靜態對象是否會引入潛在的競爭條件?

[英]Does a static object within a function introduce a potential race condition?

我對以下代碼感到好奇:

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可能會分配兩次,從而導致內存泄漏?

還是以某種方式正確處理了?

那里絕對是可能的比賽條件。 是否真的存在一個是該死的未定義。 您不應在單線程方案中使用此類代碼,因為這是糟糕的設計,但可能會導致您的應用程序在多線程中死亡。 任何像靜態const這樣的東西都應該放在方便的名稱空間中,並在應用程序的開始處分配。

如果使用多個線程,請使用信號量,這就是它們的作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM