vector et thread safe

vector et thread safe - C++ - Programmation

Marsh Posté le 02-08-2009 à 21:48:25    

salut,
 
Les conteneur de la stl sont -ils thread safe ? vector, list
et si non , la meilleur méthode est de les encapsuler dans une classe ?
Merci

Reply

Marsh Posté le 02-08-2009 à 21:48:25   

Reply

Marsh Posté le 02-08-2009 à 22:07:47    

1/ non
2/ oui

Reply

Marsh Posté le 02-08-2009 à 22:46:08    

ty

Reply

Marsh Posté le 03-08-2009 à 00:34:57    

D'ailleurs il y a moyen de connaitre la réference de l'élement inséré sans utilisé de sémaphore ?
 
Contexte :

Code :
  1. typedef struct { int value; } A;
  2. std::vector<A> myVector;
  3. A a;
  4. a.value = 5;
  5. // "locker" ici
  6. (void)myVector.push_back(a);
  7. A& b = myVector.back();
  8. // "unlocker" ici

Reply

Marsh Posté le 03-08-2009 à 09:31:19    

Même avec un mutex pour faire ton back, utiliser b en dehors de la section de critique serait foireux.

Reply

Marsh Posté le 03-08-2009 à 09:54:00    

gaffe que rendre thread safe des methodes trop fines va pourrir tes perfs car tu vas passer ta vie à entrer/sortir de zone d'attente.

Reply

Marsh Posté le 03-08-2009 à 10:51:15    

Ben ouais, c'est bien ca le probleme; en fait la question se limitait juste a la methode pour avoir la reference de l'element insere. Pour savoir si il y avait plus direct.
 
Par contre, comme le sous-entendait Taz, une reference sur un des items de std::vector<> peut me reserver des surprises si un des thread s'amuse a redimensioner la taille du vector et implique une reallocation ...

Reply

Marsh Posté le 03-08-2009 à 10:57:50    

Si tu veux aller par là, mieux vaut utiliser un vector de smartpointers eux-mêmes threadsafe: comme ça, ce que tu ramasses n'est pas pourri.

Reply

Marsh Posté le 03-08-2009 à 13:32:28    

Taz a écrit :

Si tu veux aller par là, mieux vaut utiliser un vector de smartpointers eux-mêmes threadsafe: comme ça, ce que tu ramasses n'est pas pourri.


Ca parait deja mieux.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed