Seite 1 von 1
QThread & QMutex
Verfasst: 24. September 2006 16:40
von GwarDrazul
Hallo zusammen,
Gegeben sei eine Klasse wie diese hier:
Code: Alles auswählen
class MyThread : public QThread
public:
MyThread(MyClass* mc, QObject* parent = 0)
: QObject(parent), m_mc(mc) {}
~MyThread;
void run(){QMutexLocker(&m_mutex); /* do something */};
private:
QMutex m_mutex;
MyClass* m_mc;
Meine Frage ist: sperrt der mutex jeden Zugriff von anderen Threads auf die Instanz von MyClass, welche im Konstruktor übergeben wurde? Oder wird lediglich der Zugriff auf den Pointer auf die Instanz gesperrt?
Vielen Dank, Gwar
Verfasst: 26. September 2006 15:57
von Christian81
Keines von beiden.
Verfasst: 26. September 2006 17:51
von GwarDrazul
Danke für die Antwort.
Was passiert denn dann? Und wie kann ich erreichen, dass auf die Instanz der Klasse MyClass dann nur noch von einem Thread zugegriffen werden kann (nämlich von der Instanz von MyThread, die auch den mutex als Member hat).
Viele Grüße
Verfasst: 26. September 2006 18:42
von Christian81
Ein Mutex oder MutexLocker ist nicht dazu da, einen Zugriff zu unterbinden, sondern dient nur dazu, dass ein Programmteil nur von einem Thread gleichzeitig ausgeführt werden kann. Also sollte wohl der Mutexlocker an die Stelle in MyClass, die nicht gleichzeitig von zwei Thread ausgeführt werden darf (z.B. wegen einer statischen Variable)
Verfasst: 27. September 2006 09:51
von GwarDrazul
Danke. Ich denke meine Frage war missverständlich formuliert. Dafür entschuldige ich mich. Mit "Zugriff unterbinden" meinte ich dass ein Programmteil nur von einem Thread aus ausgeführt werden kann (in der Sekunde ist der Zugriff auf diesen Programmteil ja für *andere* Threads sozusagen unterbunden).
Also sollte wohl der Mutexlocker an die Stelle in MyClass, die nicht gleichzeitig von zwei Thread ausgeführt werden darf
Das hat mir sehr weiter geholfen. Danke hierfür.
Weißt Du zufällig auch, wie ich folgendes realisieren kann:
Ich habe einen Thread A, der Einen Datentyp T sequentiell mit Informationen füllt.
Ich möchte den Zugriff auf die Instanz von T verhindern. Es soll also nicht möglich sein, dass ein anderer Thread T in irgend einer Form verändert. Zwar ist es *theoretisch* nicht möglich, dass ein anderer Thread auf die Instanz von T zugreift aber ich möchte lieber sicher gehen...
Viele Grüße
Verfasst: 8. Januar 2008 20:20
von RD1978
Hallo,
ich hab hier auch grad ein paar (Verständnis-) Probleme...
Ein Mutex oder MutexLocker ist nicht dazu da, einen Zugriff zu unterbinden, sondern dient nur dazu, dass ein Programmteil nur von einem Thread gleichzeitig ausgeführt werden kann. Also sollte wohl der Mutexlocker an die Stelle in MyClass, die nicht gleichzeitig von zwei Thread ausgeführt werden darf (z.B. wegen einer statischen Variable)
Bsp.: Angenommen ich habe in MyClass statische Variablen, die von normalen Methoden aus MyClass gelesen bzw. beschrieben werden. Um zu verhindern das mehrere Threads gleichzeitig lesen bzw. schreiben, kann ich die kritischen Bereiche ja durch einen QMutex schützen.
Meine Frage ist nun, ob das QMutex Objekt dann auch statisch sein muß? Wenn in jedem Thread ein neues Objekt von MyClass erzeugt wird, würde ja auch immer ein neues QMutex Objekt erzeugt werden.
Verfasst: 8. Januar 2008 20:48
von upsala
Selbstverständlich muß der QMutex dann auch statisch sein. Wenn du allerdings mehrere statische Variablen in deiner Klasse hast würde ich 1. über mein Klassenkonzept und 2. über einen Singleton nachdenken.
Verfasst: 8. Januar 2008 21:06
von RD1978
Danke erstmal für Deine schnelle Antwort...
Stimmt!!! Ein Singleton ist hier wohl die bessere Lösung. Man denkt manchmal viel zu kompliziert.