2016-06-29 12 views
1

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 :)

+0

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. –

+0

Nicht threadsicher, Einfügungen und Entfernen ändern den Container, unabhängig von dem spezifischen Index, an dem Sie gerade arbeiten. –

+1

Ja, die einfachste Lösung besteht darin, den Zugriff auf die Karte mit einem Mutex zu schützen. –

Antwort

4

QMap ist nicht Thread-sicher, aber einspringenden.

auf Ihre bearbeiten zu beantworten, können Sie Qt verwenden Tools wie Klassen (zB: QMutex) oder die Grundfunktionen (zB: QCoreApplication :: postevent())

Weitere Informationen, siehe Qt Erklärungen hier: http://doc.qt.io/qt-4.8/threads-reentrancy.html

Hoffen Sie, dass Hilfe!