C++ Accès à vecteur à partir de plusieurs threads
Dans mon programme, j'ai quelques threads en cours d'exécution. Chaque fil est un pointeur vers un objet (dans mon programme - vecteur). Et chaque thread modifie le vecteur.
Et parfois mon programme ne fonctionne pas avec une segm-faute. J'ai pensé qu'elle s'est produite parce que le thread A commence à faire quelque chose avec le vecteur tandis que le thread B n'a pas fini d'exploitation avec elle? Peut-il de l'abeille vrai?
Comment suis-je censé faire? La synchronisation des threads? Ou peut-être faire un drapeau VectorIsInUse
et de définir cet indicateur à true lors de l'exploitation avec elle?
Vous avez probablement besoin d'éviter les opérations d'écriture avec les mutex. Notez que même si vous verrouillez les opérations d'écriture, les itérateurs et les références peuvent invalidé, donc il n'est pas totalement sûr de la solution. Vous êtes mieux de ne pas effectuer la modification des opérations de plus d'un thread.
Salut, une erreur de segmentation est généralement causée par l'accès à de la mémoire qui n'est pas réservé par votre processus. Se pourrait-il que vous utilisez quelque chose comme un pointeur qui n'est pas réellement un pointeur? Sinon, vérifiez ceci: stackoverflow.com/questions/1099513/...
Downvote? Commentaire il vous plaît.
non seulement les opérations d'écriture, tous les opérations. Tous les accès partage de données doit être protégé.
d'accord, et certains accès (par exemple, des références à des éléments du conteneur ou des itérateurs) vous ne pouvez pas vraiment le protéger de toute façon...
Salut, une erreur de segmentation est généralement causée par l'accès à de la mémoire qui n'est pas réservé par votre processus. Se pourrait-il que vous utilisez quelque chose comme un pointeur qui n'est pas réellement un pointeur? Sinon, vérifiez ceci: stackoverflow.com/questions/1099513/...
Downvote? Commentaire il vous plaît.
non seulement les opérations d'écriture, tous les opérations. Tous les accès partage de données doit être protégé.
d'accord, et certains accès (par exemple, des références à des éléments du conteneur ou des itérateurs) vous ne pouvez pas vraiment le protéger de toute façon...
OriginalL'auteur Kolyunya | 2012-09-04
Vous devez vous connecter pour publier un commentaire.
vector
, comme tous les conteneurs STL, n'est pas thread-safe. Vous devez explicitement gérer la synchronisation de vous-même. Unstd::mutex
ouboost::mutex
pourrait être utilisé pour synchroniser l'accès à lavector
.Ne pas utiliser un drapeau que ce n'est pas thread-safe:
isInUse
drapeau et il estfalse
isInUse
drapeau et il estfalse
isInUse
àtrue
isInUse
estfalse
et il définittrue
vector
Noter que chaque thread aura pour verrouiller le
vector
pour tout le temps, il doit l'utiliser. Cela comprend la modification de lavector
et à l'aide de lavector
's itérateurs que les itérateurs peut devenir caduque si l'élément qu'ils appellenterase()
ou lavector
fait l'objet d'une réaffectation interne. Par exemple ne pas:yep. Était encore de mise à jour.
Volontiers. J'ai complètement mal lu votre réponse. J'ai vu l'exemple de code et j'étais comme "WHAAA EPIC FAIL!". Ensuite, j'étais comme, "Oh, attendez.".
Dans tous les cas, avoir explicitement n'oubliez pas de verrouiller le mutex avant d'utiliser le vecteur est assez dangereux, car rien n'empêche accidentel de mauvaise utilisation, et rien n'empêche de les itérateurs de s'échapper. Un
concurrent_vector
est beaucoup plus sûr.est
concurrent_vector
Microsoft?OriginalL'auteur hmjd
Si vous voulez un conteneur qui est sûr à utiliser à partir de plusieurs threads, vous devez utiliser un conteneur qui est explicitement conçu pour le but. L'interface de l'conteneurs Standard n'est pas conçu pour la mutation simultanée ou toute sorte de simultanéité, et vous ne pouvez pas simplement jeter un verrou au problème.
Vous besoin de quelque chose comme TBB ou PPL qui a
concurrent_vector
.<g>
OriginalL'auteur Puppy
C'est pourquoi presque tous les bibliothèque de classe qui propose des fils aussi a des primitives de synchronisation tels que les mutex/verrous. Vous avez besoin pour l'installation de l'un de ces, et de l'acquisition/libérer le verrou autour de chaque opération sur la ressource partagée (opérations de lecture ET écriture, car vous avez besoin pour éviter les lectures de se produire au cours d'une écriture trop, et pas seulement d'empêcher plusieurs écritures se produire simultanément).
OriginalL'auteur Christian Stieber