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
   }
   [...]
}

...この場合、2 つのスレッドがほぼ同時に MyFunction() を呼び出すと、_myArray が 2 回割り当てられ、メモリ リークが発生する可能性があります。

それとも、これはどういうわけか正しく処理されていますか?

4

2 に答える 2

1

そこには絶対に可能な競合状態があります。実際に存在するかどうかは、まったく定義されていません。このようなコードは設計が悪いため、シングル スレッドのシナリオでは使用しないでください。ただし、マルチスレッドではアプリが機能しなくなる可能性があります。そのような static const のものは、おそらく便利な名前空間に入れ、アプリケーションの開始時に割り当てられるべきです。

于 2010-05-30T17:14:48.183 に答える
0

複数のスレッドを使用している場合は、セマフォを使用してください。それが目的です。

于 2010-05-30T17:14:42.177 に答える