QThread & QMutex

Alles rund um die Programmierung mit Qt
Antworten
GwarDrazul
Beiträge: 23
Registriert: 5. Juni 2006 18:56

QThread & QMutex

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Keines von beiden.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
GwarDrazul
Beiträge: 23
Registriert: 5. Juni 2006 18:56

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
GwarDrazul
Beiträge: 23
Registriert: 5. Juni 2006 18:56

Beitrag 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
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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.
RD1978
Beiträge: 84
Registriert: 5. Juni 2007 08:00
Wohnort: Stralsund (DDR)

Beitrag 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.
Antworten