J'ai une bibliothèque C ++, qui supposait faire des calculs sur plusieurs threads. J'ai créé un code de threads indépendant (c'est-à-dire qu'il n'y a pas de variables partagées entre eux), à l'exception d'un tableau. Le problème est que je ne sais pas comment faire le thread-coffre-fort.
J'ai regardé mutex verrou / déverrouiller ( Puis j'ai lu sur et il a produit une erreur de compilateur ( utilisation de la fonction supprimée 'std :: atomic :: atomic (const std :: atomique &) ' em>). Ensuite, j'ai trouvé la solution - Utilisez une enveloppe spéciale pour Cette chose compile avec succès, mais quand je ne peux pas remplir le vecteur: p> quoi Est-ce que je fais mal? Je suppose que j'ai tout essayé (peut-être pas, de toute façon) et rien n'aidé. Y a-t-il d'autres moyens pour le partage de la matrice Thread-Safe en C ++? P> D'ailleurs, j'utilise le compilateur Mingw 32bit 4.7 sur Windows. P> P> qmutex code>, comme j'utilise qt), mais ce n'est pas Ajustez pour ma tâche - tandis qu'un thread verrouille le mutex, d'autres threads attendent! P>
std :: atomique code>, qui ressemblait exactement à ce dont j'avais besoin. Néanmoins, j'ai essayé de l'utiliser de la manière suivante: p>
std :: atomique code>. J'ai essayé ceci: p>
3 Réponses :
Vous essayez de copier un type non copié: le constructeur Si vous en avez besoin pour être initialisé de aussi quelques points mineurs: p>
Le constructeur de copie et l'opérateur d'affectation doivent prendre leurs valeurs par allouant le vecteur avec Assurez-vous de ne jamais redimensionner le tableau pendant que d'autres threads pourraient y accéder. P> LI>
ul> atomicuint64 code> prend un
atomique code> par valeur. p>
atomique code>, il devrait alors prendre l'argument par (const) référence. Cependant, dans votre cas, il ne semble pas que vous ayez besoin d'initialiser à partir de
atomique code> du tout; Pourquoi ne pas initialiser de
uint64_t code> à la place? p>
const code> référence, pour permettre aux temporaires d'être copiés. p> li>
nouveau code> est une chose assez étrange à faire; Vous ne faites que ajouter un niveau supplémentaire d'indirection sans avantage. P> li>
Merci beaucoup pour une explication des points mineurs, et surtout pour Const code>, je ne savais pas de telles bases.
cette ligne Vous ignorez complètement l'argument que vous transmettez, vous voulez probablement que ce soit.load () et vous voulez probablement prendre des éléments de la référence de Const ne sont pas copiés. p> comme pour ce que vous faites, je ne sais pas si c'est correct. La modification des variables à l'intérieur de la matrice sera atomique, mais si le vecteur est modifié ou réaffecté (ce qui est possible avec push_back code>), il n'y a rien à garantir que vos modifications de matrice fonctionneront entre les threads et être atomiques . p> p>
Voici une version nettoyée de votre et utilisez: p> Ou: P> atomicuint64 code> type:
AtomicUInt64 value(x);
myVector->push_back ( value );
S'il vous plaît dites-moi comment accéder à ce vecteur? Je veux savoir ce qui est stocké dans le vecteur.
Voulez-vous une taille de taille fixe (dans la partie multithread) de éléments partagés i> ou tableau partagé i> d'éléments. Je veux dire, faire des insertions et des suppressions dans la matrice ont une place dans une partie de code multithreaded i>?
La matrice a une taille fixe - je n'ai pas d'insertions ni de suppressions dans des threads.
@ahawkthomes: vous poussez_back, qui change généralement la taille ...
Eh bien, comment peut initialiser
std :: vecteur code> sans utiliser
push_back code>? Désolé pour de telles questions muettes, mais je ne sais rien, mais
std :: vecteur t = {0, 0, 0} code> - et cette approche est évidemment inutile avec une grande quantité d'articles.
En outre, comprenez-vous que vos opérations d'emballage ne sont pas des opérations atomiques i>.