Thread-safe vecteur

Permettez-moi de commencer par dire que j'ai lu la plupart, et d'autres rubriques sur le sujet.

La façon dont je comprends les choses, std::vector sera réallouer la mémoire lors de la repousse de nouveaux éléments, ce qui est mon cas, à moins que j'ai réservé un espace suffisant (ce qui est pas mon cas).

Ce que j'ai est un vecteur de std::shared_ptr, et que le vecteur est titulaire d'objets uniques (ou, plus correctement, des pointeurs vers des objets uniques dans le vecteur).

À la manipulation de ces objets via des pointeurs est enroulé autour d'une Usine & classe de Gestionnaire, mais les pointeurs vers les objets sont accessibles depuis l'extérieur de la classe wrapper et peut avoir des valeurs de membre modifiés. Il n'y a pas de suppression de passe à tout moment.

Si je suis bien comprendre les questions soulevées dans la précédente, DONC des questions à propos de std::vector et le fil de sécurité, en ajoutant (push_back) de nouveaux objets peut invalider précédente pointeurs, comme le vecteur de l'interne peut réallouer de la mémoire et de la copie de tout, ce qui serait évidemment une catastrophe pour moi.

Mes intentions sont à lire à partir de ce vecteur, souvent la modification des objets à travers les pointeurs, et ajouter de nouveaux éléments dans le vecteur, à partir de threads s'exécutant de manière asynchrone.

Donc,

  1. À l'aide atomique ou mutex n'est pas assez? Si je pousse arrière à partir d'un fil, un autre thread de la manipulation d'un objet via un pointeur peut-être un objet invalide?
  2. Est-il une bibliothèque qui peut gérer cette forme de MT questions? Celui que j'ai garder la lecture sur est Intel TBB, mais depuis que je suis déjà à l'aide de C++11, j'aimerais conserver les modifications à un minimum, même si cela signifie plus de travail de ma part - je veux apprendre dans le processus, et non pas simplement copier-coller.
  3. Autre que le verrouillage de l'accès, tandis que la modification d'objets, je voudrais asynchrone parallèle de l'accès en lecture pour le vecteur qui ne sera pas invalidé par push_backs. Comment puis-je y parvenir?

Si il est de toute importance, tous les ci-dessus est sur linux (debian jessie) à l'aide de gcc-4.8 avec c++11 activé.

Je suis ouvert à l'aide de mini-invasive de bibliothèques.

Merci beaucoup d'avance 🙂

Pourquoi n'utilisez-vous pas un std::deque à la place? Elle a les mêmes garanties de performance, mais ne pas réaffecter lorsque vous push_back (otoh, que, vous avez encore à protéger la push_back avec un mutex, puisque vous êtes en train de modifier l'état interne du conteneur).
Je ne me dérangerait pas d'échange pour un pont, à condition que ses interchangeable avec le vecteur sans de sérieuses modifications. Est std::deque la garantie d'être contiguë à pousser en arrière, donc la résolution de ce problème?
@MatteoItalia mentionné les files d'attente sont beaucoup mieux adapté pour protéger les opérations par thread-safe producteur/consommateur de la sémantique. Ils ne sont pas thread-safe en natif, mais vous pouvez facilement construire ce dont vous avez besoin, avec un mutex ou sémaphore, ou les deux.
L'interface est sensiblement la même (O(1) random-indice d'accès, l'accès aléatoire à des itérateurs, push/pop aux deux extrémités, ...), avec l'avantage potentiel, il est tout aussi rapide à pousser au début ou à la fin du conteneur. Le stockage n'est évidemment pas toutes contiguës (généralement, c'est fait de blocs contigus), mais cela permet d'éviter les réaffectations lorsque vous appuyez éléments.
Les valeurs à l'intérieur du conteneur sont garantis pour être conservés, il est inutile de perdre vos données lorsque vous ajoutez de nouvelles valeurs!. Ce n'est PAS la garantie d'être conservés sont les itérateurs pour le conteneur. par exemple, si vous avez lancé la numérisation du conteneur de commencer(v) à(v) et en même temps, dans un autre fil, vous v. push_back(...) - l'analyse peut échouer comme les itérateurs ne peut pas être plus valable.

OriginalL'auteur | 2014-05-12