Peut-être, mais je pense que c'était l'une des leçons apprises au début de Java - la synchronisation des données n'est généralement pas au niveau de la fonction membre du conteneur, mais une étape ci-dessus. Vous devriez utiliser des objets de synchronisation avant d'accéder à une liste non-thread-safe à la place.
Tenir compte:
ThreadSafeQueue tsq;
tsq.push_back(...); // add lots of data
...
// Find the first element that returns true for search_criteria(elem);
auto iter = tsq.find_if(search_criteria);
// (1)
if(iter != tsq.end()) // (2)
{
tsq.erase(iter);
}
Dans cette file d'attente thread-safe, il y a encore deux "lacunes" où la file d'attente peut être modifié par un autre thread. Et, en effet, votre itérateur peut être invalidé par ces changements. Maintenant, comparez:
Queue q;
q.push_back(...); // add lots of data
...
// Create some lock around a pre-existing mutex.
Lock lock(q_mutex);
// Find the first element that returns true for search_criteria(elem);
auto iter = q.find_if(search_criteria);
if(iter != q.end())
{
q.erase(iter);
}
// lock unlocks as it goes out of scope.
ici parce que le verrou a une plus grande granularité, il est possible d'assurer la cohérence entre l'algorithme écrit.
Pouvez-vous écrire ce que les opérations avez-vous vraiment besoin de la structure? Peut-être n'avez-vous pas vraiment besoin d'une double liste chaînée et une autre structure pourrait aussi fonctionner? – Suma
Comment le thread est-il sûr? Vous voulez écrire à des positions arbitraires à partir de threads arbitraires? –
À quelle vitesse souhaitez-vous que l'ajout et le retrait soient effectués? À première vue, il semble que ce soit une table de hachage qui pourrait fonctionner pour vous. Les tables de hachage sûres et évolutives sont courantes - il suffit d'en rechercher. – Suma