Disons que j'ai un vecteur de N éléments, mais jusqu'à n éléments de ce vecteur ont des données significatives. Un thread de mise à jour met à jour le nième ou n + 1er élément (puis définit n = n + 1), vérifie également si n est trop proche de N et appelle vectoriel :: resize (N + M) si nécessaire. Après la mise à jour, le thread appelle plusieurs threads enfants pour lire jusqu'à nième données et effectuer des calculs.Le vecteur STL et la sécurité des threads
Il est garanti que les threads enfants ne modifient ou ne suppriment jamais de données (en fait, aucune donnée n'est supprimée) et que le programme de mise à jour appelle les enfants juste après la fin de la mise à jour. Jusqu'à présent, aucun problème n'est survenu, mais je voudrais savoir si un problème peut survenir lors de la réaffectation d'un vecteur à un bloc de mémoire plus grand, s'il reste des fils de travail pour enfants à partir de la mise à jour précédente.
Ou est-il sûr d'utiliser un vecteur, car il n'est pas thread-safe, dans un tel cas multithread?
EDIT: Étant donné que seule l'insertion a lieu lorsque le programme de mise à jour appelle vector :: resize (N + M, 0), y a-t-il des solutions possibles à mon problème? En raison de la grande performance du vecteur STL je ne suis pas disposé à le remplacer par un vecteur verrouillable ou dans ce cas existe-t-il des vecteurs performants, connus et sans verrou?
McNellis @ James: Oui. C'est un bon conseil.Je peux faire la réaffectation moi-même. En fait, les vecteurs sont enveloppés dans une classe qui contient un pointeur sur le vecteur. Ce n'est pas shared_ptr mais je peux facilement construire un nouveau grand vecteur, copier des éléments de l'ancien, le supprimer. Alors, quel est le moyen le plus rapide pour copier un grand bloc de mémoire. CopyMemory()? –
Une solution plus simple ne serait-elle pas d'utiliser 'std :: deque' au lieu d'un vecteur? Cela évite entièrement les réallocations, tout en offrant des performances proches du vecteur. – jalf
@jalf: Je ne pense pas qu'il soit sûr d'utiliser un 'std :: deque' car les réaffectations ne sont pas la seule préoccupation. Il n'y a aucune garantie que 'std :: deque :: operator []' ne vérifie pas la taille ou toute autre comptabilité interne au 'deque', donc il y a un potentiel pour une condition de concurrence où un consommateur appelle' operator [] ', qui lit l'état interne pendant que le producteur ajoute des données, ce qui modifie l'état interne. –