J'ai des affirmations inattendues faillures dans mon code en utilisant une implentation STL vérifiée. Après quelques recherches, j'ai réduit le problème à un push_back dans un vecteur appelé à partir d'un thread différent de celui dans lequel le vecteur a été créé.Vecteur C++, push_back d'un autre thread s'écrase?
Le code de reproduire ce problème est simple:
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é de mon thread principal, et ajouter est appelé à partir d'un autre thread. Cependant, il n'y a pas de problème de concurence: dans la forme la plus simple du code que j'ai utilisé pour le dépannage, personne ne lit ou n'écrit à partir de ce vecteur sauf les cas que j'ai mentionnés plus haut.
Tracé dans le code push_back, j'ai remarqué que certaines méthodes de std :: vector comme count() ou size() renvoient garbage, quand elles sont appelées de l'autre thred (méthode "add"), et corrigent les valeurs à partir du thread de création (dans le constructeur par exemple)
Faut-il conclure que std :: vector n'est pas utilisable dans un environnement multithread? Ou y a-t-il une solution à ce problème?
EDIT: suppression volatile
EDIT 2: Pensez-vous qu'il est possible que le problème ne réside pas dans multithread? Dans mon test, add n'est appelé qu'une seule fois (vérifié en utilisant un point de rupture). Si je supprime le push_back du constructeur, je plante toujours. Donc, à la fin, même avec un seul appel à la méthode d'un vecteur, dans une fonction appelée une fois, l'assertion échoue. Par conséquent, il ne peut y avoir de concurence, ou ...?
S'il n'y a en effet aucun vecteur de concurrence devrait fonctionner. S'il y a 2 threads ou plus travaillant avec vector * en parallèle *, cela ne fonctionnera pas. – Drakosha
Êtes-vous dans un environnement où chaque thread a son propre tas? – JimR
Essayez d'appeler 'reserve'. – Fozi