Представляет ли статический объект в функции потенциальное состояние гонки? - PullRequest
0 голосов
/ 30 мая 2010

Мне интересно следующий код:

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 может быть выделен дважды, что приведет к утечке памяти?

Или это как-то правильно обрабатывается?

Ответы [ 2 ]

1 голос
/ 30 мая 2010

Там абсолютно возможное состояние гонки. Есть или нет на самом деле один чертовски неопределенно. Вы не должны использовать такой код в однопоточных сценариях, потому что это плохой дизайн, но это может привести к смерти вашего приложения в многопоточном режиме. Все, что является статическим константой, должно быть в удобном пространстве имен и выделяться в начале приложения.

0 голосов
/ 30 мая 2010

Используйте семафор, если вы используете несколько потоков, для этого они и нужны.

...