Ich habe std::list<Info> infoList
in meiner Anwendung, die zwischen zwei Threads geteilt wird. Diese zwei Threads den Zugriff auf diese Liste wie folgt:Was ist der beste Weg, Container-Zugriff zwischen mehreren Threads in Echtzeit-Anwendung zu synchronisieren
Thread 1: uses push_back()
, pop_front()
oder clear()
auf der Liste (je nach Situation) Thread 2: verwendet einen iterator
durch die Elemente in der iterieren Liste und mache einige Aktionen.
Thread 2 iteriert die Liste wie folgt aus:
for(std::list<Info>::iterator i = infoList.begin(); i != infoList.end(); ++i)
{
DoAction(i);
}
Der Code kompiliert mit GCC 4.4.2.
Manchmal ++ i verursacht einen segfault und stürzt die Anwendung ab. Der Fehler wird in std_list.h Linie 143 auf der folgenden Zeile verursacht:
_M_node = _M_node->_M_next;
Ich denke, dies ist ein Rennzustand ist. Die Liste wurde möglicherweise von Thread 1 geändert oder sogar gelöscht, während Thread 2 sie wiederholte.
Ich benutzte Mutex, um den Zugriff auf diese Liste zu synchronisieren, und alles ging während meines ersten Tests in Ordnung. Aber das System friert nur im Stresstest ein und macht diese Lösung völlig inakzeptabel. Diese Anwendung ist eine Echtzeitanwendung und ich muss eine Lösung finden, damit beide Threads so schnell wie möglich ausgeführt werden können, ohne den Gesamtdurchsatz der Anwendungen zu beeinträchtigen.
Meine Frage ist dies: Thread 1 und Thread 2 müssen so schnell wie möglich ausgeführt werden, da dies eine Echtzeitanwendung ist. Was kann ich tun, um dieses Problem zu vermeiden und dennoch die Anwendungsleistung aufrechtzuerhalten? Gibt es für ein solches Problem einen Lock-Free-Algorithmus?
Es ist in Ordnung, wenn ich einige neu hinzugefügte Info
Objekte in der Iteration von Thread 2 vermisse, aber was kann ich tun, um zu verhindern, dass der Iterator zu einem dangling pointer wird?
Dank
Sutters Artikel über das Schreiben einer sperrfreien Warteschlange könnte helfen: http://www.ddj.com/cpp/210604448 –
http://StackOverflow.com/Questions/1724630/How-Doi-Build- a-lockless-queue –
Warum können Sie keine Warteschlange anstelle einer Liste verwenden? Wie wird Ihr Consumer-Thread über neue Info-Objekte benachrichtigt? –