Je suis curieux de savoir le code suivant:Un objet statique dans une fonction introduit-il une condition de concurrence potentielle?
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;
[...]
}
est-il une condition de course possible dans le code ci-dessus? Plus précisément, le compilateur est-il susceptible de générer du code équivalent à ce qui suit, «en coulisses»?
void MyFunction()
{
static bool _myClassObjectInitialized = false;
if (_myClassObjectInitialized == false)
{
_myClassObjectInitialized = true;
_myClassObject.MyClass(); // call constructor to set up object
}
[...]
}
... dans ce cas, si deux fils devaient appeler MyFunction() presque-simultanément, puis _myArray pourrait obtenir attribué deux fois, ce qui provoque une fuite de mémoire?
Ou est-ce géré correctement en quelque sorte?
Beaucoup de dupes, y compris http://stackoverflow.com/questions/246564/what-is-the-lifetime-of-a-static-variable-in-ac-function –
Ceci est probablement aussi pertinent: http://stackoverflow.com/questions/1661529/is-meyers-implementation-of-singleton-pattern-thread-safe –