C++ Vecteur, push_back partir d'un autre thread s'écraser?

J'ai inattendu affirmations faillures dans mon code à l'aide d'un vérifiée implémentation de la STL.

Après quelques recherches, j'ai réduit le problème à un push_back dans un vecteur appelé à partir d'un autre thread que celui dans lequel le vecteur a été créé.

Le code le plus simple pour reproduire ce problème est :

class SomeClass
    {
    private:
        std::vector<int> theVector;
    public:
        SomeClass () 
        {
            theVector.push_back(1); //Ok
        }


        void add()
     {
          theVector.push_back(1); //Crash 
     }
};

La seule différence est que SomeClass est instanciée à partir de mon thread principal, et ajouter est appelée à partir d'un autre thread. Cependant, il n'est pas concurency question : dans la forme la plus simple de code que j'ai utilisé pour le dépannage, personne n'est en lecture ou en écriture à partir de ce vecteur, sauf les cas que j'ai mentionnés ci-dessus.

Le suivi dans le push_back code, j'ai remarqué que certaines méthodes de std::vector comme count() ou size() retour à ordures, lorsqu'elle est appelée à partir de l'autre thred (méthode "ajouter"), et les valeurs correctes lorsqu'il est appelé à partir de la création de thread (dans le constructeur par exemple)

Dois-je en conclure que std::vector n'est pas utilisable dans un multithread de l'environnement ? Ou est-il une solution pour ce problème ?

EDIT : supprimé volatils

EDIT 2 : pensez-vous qu'il est possible que le problème ne réside pas dans multithread ? Dans mon essai, ajouter est appelée qu'une seule fois (vérifié à l'aide d'un point de rupture). Si je supprime le push_back à partir du constructeur, je plante toujours. Donc au final, même avec un seul appel à un vecteur de la méthode, dans une fonction appelée une fois que l'assertion échoue. Par conséquent, il ne peut pas être concurency, ou ... ?

si il n'y a en effet pas de simultanéité vecteur devrait fonctionner. Si il y a 2 ou plusieurs threads de travail avec vector en parallèle, cela ne fonctionnera pas.
Êtes-vous dans un environnement où chaque thread a son propre tas?
Essayez d'appeler reserve.
-1: Votre code ne peut même pas compiler depuis push_back() n'est pas déclaré comme "volatile". Pouvez-vous fournir une vue plus détaillée de code/description?
"Dois-je en conclure que std::vector n'est pas utilisable dans un multithread de l'environnement ?" - pas du tout, le vecteur n'est pas censé faire toute différente dans les multi-threaded application dans un seul thread. En fait, si vous comparez le C++0x (qui est thread-conscient) vecteur n'est pas différent de C++97 (ce qui n'est pas thread-conscient). Il est de la responsabilité de l'application, et non le vecteur, de fournir la sérialisation, si nécessaire. Dans votre cas, je pense que votre affirmation que le multi-threading n'a pas de rôle dans les comportements observables est susceptible d'être faux, faire le bon verrouillage au lieu de spéculer.

OriginalL'auteur Dinaiz | 2010-12-10