Ich schreibe ein Multithreading-Programm in C++. Im Programm habe ich ein globales Map-Objekt verwendet, das einen pthread_t als Schlüssel und ein Paar als Wert enthält. Das Paar wird nach Wert eingefügt (mithilfe von make_pair). Das Paar enthält eine Liste (nach Wert eingefügt) als erstes Element. Zu dieser Liste möchte ich lesen und schreiben. (Das zweite Element ist pthread_mutex_t.)Liste in C++ ist nicht leer, aber es gibt keine Elemente zum Iterieren
Nun, ich habe Mutex, die ich verwende, um die Leseoperationen & auf der Liste zu steuern. Ich konnte auch sehen, dass das Schieben der Elemente zur Liste erfolgreich war. Wie auch immer, mit der Methode list.empty im Thread, nennen wir es X, konnte ich sehen, dass die Liste nicht leer ist (ohne Mutex, was bei meinem speziellen Design kein Problem darstellt). Daher habe ich den Mutex verwendet, um die Liste zu sperren und die Elemente zu iterieren. Aber - die Iteration ist nicht passiert - so, als ob es keine Elemente in der Liste gäbe.
Hier ist ein Code-Snippest. Übrigens möchte ich pthread_t und keine anderen Optionen verwenden.
Einfügung - Ich überprüfte, es funktioniert: ThreadData & data = threadsOutput [my_key];
data.first.push_back(std::make_pair<Obj1*, Obj2*>(std::move(key),std::move(value)));
Iterieren: // einige Code zu überprüfen, ob die betreffende Liste
// the list is not empty, so running:
ThreadData& data = threadsOutput[my_key];
if (pthread_mutex_lock(&(data.second))) // data.second is the relevant pthread_mutex_t
return; // not arrives here - lock succeeded
MapResult::iterator it = data.first.begin();
for (; it != data.first.end(); ++it)
{
//some code - not arrives to this code
}
Dank leer
ist!
Aus Neugier, was verhindert, dass die Karte zwischen der Zeit, die Sie die Referenz erhalten, und der Zeit, in der Sie den Mutex tatsächlich verriegeln, geändert wird (und damit die Hot-Referenz ungültig wird). – WhozCraig
"check ohne Mutex, was bei meinem speziellen Design kein Problem darstellt" - welches magisches Design könnte es der "leeren" Methode ermöglichen, (a) korrekt zu funktionieren und (b) ein brauchbares Ergebnis zu erhalten, wenn es ohne Call aufgerufen wird der Mutex gehalten? – davmac
ist es nicht beheben dieses Problem - aber der allgemeine Ablauf des Programms funktioniert auf eine Weise, dass, wenn der Thread Daten verpasst (da der Thread falsche Antworten aus dem leeren), diese Daten später behandelt werden. –