Seite 1 von 1

Verständnisfragen zum Thema "Threads"

Verfasst: 9. August 2008 17:28
von comer352l
Hallo,

ich arbeite jetzt schon seit längerem mit Threads, aber einige Fragen stellen sich immer noch bzw. ich habe teilweise widersprüchliches darüber gelesen. Hier sind 2 davon:

1.) Standard-Beispiel: Thread mit while-Schleife, die solange läuft, bis eine gemeinsame boolsche Variable (oder meinetwegen auch ein integer) zum Abbrechen gesetzt wird.
Muss man hier die Überprüfung der Variable bei jedem Schleifen-Durchlauf auch mit einem Mutex absichern ? Wie schaut es beim setzten (also Schreib-Zugriff) durch den anderen Thread aus ? Stichwort "atomic operations".
Bei komplexeren Datentypen oder Rechenoperationen ist mir die Sache ja klar...

2.) Was geschieht, wenn ich ein ganz normales C-Array (also z.B. char myArray[256]) mit einem QMutex schütze ? Ist der Zugriff auf die Elemente dann safe ? myArray ist ja nur ein Pointer, folglich wären nur die Address-Zuweisung für das erste Element (also z.B. myArray = 0x12345678) safe. Der Zugriff auf die Addressen der anderen Elemente und vorallem die Elemente selbst wäre nicht safe.
Oder schnallt der Mutex das etwa und sorgt für einen kompletten Schutz ?

Gruß,

Frank

Verfasst: 2. September 2008 23:32
von child3
1.) Du brauchst keinen Mutex.

2.) Ein Mutex bedeutet Mutual Exclusion -> „gegen- oder wechselseitiger Ausschluss“

Du verhinderst, dass in deinem Code ein Kritischer Abschnitt in dem z.B. Datenstrukturen, verändert werden nicht parallel ausgeführt werden darf.
Andernfalls kann es zu inkonsistenten Zuständen der Daten führen.

Ein Mutex hat keine Ahnung was du in deinem "Kritischer Abschnitt" machst. Daten Strukturen werden also nicht geschützt. (auch das C Array :-)

Verfasst: 3. September 2008 09:15
von upsala
Für 1. könnte man auch eine QWaitCondition nehmen.

Und von der generellen Logik her müßte man eine gemeinsame Variable durch einen Mutex absichern...

Verfasst: 3. September 2008 09:21
von Christian81
child3 hat geschrieben:1.) Du brauchst keinen Mutex.
Doch. Man muss die Variable sogar noch als 'volatile' definieren damit der Compiler nicht auf die Idee kommt das Auslesen aus dem Speicher wegzuoptimieren.

Verfasst: 7. September 2008 22:15
von child3
Christian81 hat geschrieben: Doch. Man muss die Variable sogar noch als 'volatile' definieren damit der Compiler nicht auf die Idee kommt das Auslesen aus dem Speicher wegzuoptimieren.
Wow! Das war mir nicht bekannt. Danke für die Aufklährung.