I QT5 auf Windows 7.
In meinem aktuellen App verwende, habe ich (hier vereinfacht) folgendes:Qt: Fragen über QMap Thread-Sicherheit
QMap<int, QString> map;
int _WorkerThread_(int index)
{
QString new_element = "whatever";
...
map.insert(index, new_element); // [Q1]
...
}
int _MainThread_()
{
int i;
...
i = some_value();
map.remove(i); // [Q2]
...
}
Ich habe 2 Fragen zu den obigen Code und in Bezug auf QMap
Thread-Sicherheit (ich habe nicht viele Informationen über sie in der Qt-Dokumentation):
1) Ist map.insert(..)
-siehe Code-line [Q1] markiert - sicher verwendet werden wie Es ist oben, wenn mehrgestartet wirdThreads gleichzeitig?
2) Wie sicher/thread-safe ist ein Element aus den QMap
zu entfernen - siehe Code-line [Q2] markiert - wenn (irgendwie) sichergestellt ist, dass der Wert von i
nicht unter die Indizes, die derzeit von Arbeitsthreads verwendet werden?
[Bearbeiten]:
Also, Sie sagen, ich einen Mutex verwenden sollte, oder was? Vielen Dank im Voraus für jede Idee oder einen Vorschlag :)
QMap ist "reentrant" definiert hier: http://doc.qt.io/qt-4.8/threads-reentrancy.html#reentrant. Mein Fazit ist NICHT Thread-sicher. dh 1) Nein, 2) Nein. –
Nicht threadsicher, Einfügungen und Entfernen ändern den Container, unabhängig von dem spezifischen Index, an dem Sie gerade arbeiten. –
Ja, die einfachste Lösung besteht darin, den Zugriff auf die Karte mit einem Mutex zu schützen. –