mutex ja oder nein
-
hi, ich habe ein mehrdimensionales array und mehrere threads die in jeweils unterschiedlichen dimensionen reinschreiben wollen, nur 1 thread schreib in 1 dimension....brauche ich dazu auch einen mutex?
-
marko1 schrieb:
hi, ich habe ein mehrdimensionales array und mehrere threads die in jeweils unterschiedlichen dimensionen reinschreiben wollen, nur 1 thread schreib in 1 dimension....brauche ich dazu auch einen mutex?
Hmm.... Ich koennt mir folgende Situation vorstellen:
auf einem Multiprozessor-PC laeuft Thread 1 auf CPU 1, Thread 2 auf CPU 2.
Thread 1 bearbeitet jetzt seine Zeile im Array, läd hierfür aber (kA. schlechte Compileroptimierung oder sonstwas) DAS GANZE Array in seinen L1-Chache. Thread 2 macht das selbe. Thread 1 schreibt dann die Daten aus dem L1-Chache zurück in den RAM, und dann kommt Thread 2, und ÜBERSCHREIBT jene Daten mit seinen Daten. Die Änderungen, die Thread 1 an seiner Zeile gemacht hat, gehen damit verloren.
DISCLAIMER: ich hab keine Ahnung ob sowas wirklich passieren kann oder nicht.
Wieso nicht gleich jeder Thread sein eigenes Array?
-
grund: soll ich zb 2000 arrays per hand erstellen?
-
Ne, sowas kann auf normalen Architekturen nicht passieren. Das Caching läuft schließlich transparent ab. Mit solchen Problem schlagen sich nur die Leute rum, die die CPUs bauen.
-
Blue-Tiger schrieb:
Thread 1 bearbeitet jetzt seine Zeile im Array, läd hierfür aber (kA. schlechte Compileroptimierung oder sonstwas) DAS GANZE Array in seinen L1-Chache. Thread 2 macht das selbe. Thread 1 schreibt dann die Daten aus dem L1-Chache zurück in den RAM, und dann kommt Thread 2, und ÜBERSCHREIBT jene Daten mit seinen Daten. Die Änderungen, die Thread 1 an seiner Zeile gemacht hat, gehen damit verloren.
wenn sowas passiert (was ich nicht glauben kann), hilft auch kein mutex

-
net schrieb:
wenn sowas passiert (was ich nicht glauben kann), hilft auch kein mutex

Doch. Wenn du sicherstellst, dass ein Thread, wenn er den Mutex belegt, den kompletten Zyklus (lesen, bearbeiten, zurückschreiben) durchführt, bevor er den Mutex wieder freigibt.
marko1 schrieb:
grund: soll ich zb 2000 arrays per hand erstellen?
Was meinst du damit?
-
DarthZiu schrieb:
net schrieb:
wenn sowas passiert (was ich nicht glauben kann), hilft auch kein mutex

Doch. Wenn du sicherstellst, dass ein Thread, wenn er den Mutex belegt, den kompletten Zyklus (lesen, bearbeiten, zurückschreiben) durchführt, bevor er den Mutex wieder freigibt.
hilft trotzdem nix. in dem oben beschriebenen szenario überschreibt der zuletzt aktive thread die ergebnisse aller vorherigen threads. ein mutex o.ä. schützt hierbei nur vor datensalat. aber wie schon erwähnt: soooo schlechten code wird der mieseste compiler der welt nicht erzeugen

-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
net schrieb:
DarthZiu schrieb:
net schrieb:
wenn sowas passiert (was ich nicht glauben kann), hilft auch kein mutex

Doch. Wenn du sicherstellst, dass ein Thread, wenn er den Mutex belegt, den kompletten Zyklus (lesen, bearbeiten, zurückschreiben) durchführt, bevor er den Mutex wieder freigibt.
hilft trotzdem nix. in dem oben beschriebenen szenario überschreibt der zuletzt aktive thread die ergebnisse aller vorherigen threads. ein mutex o.ä. schützt hierbei nur vor datensalat. aber wie schon erwähnt: soooo schlechten code wird der mieseste compiler der welt nicht erzeugen

Doch, der Mutex wuerde verhindern dass Thread2 ueberhaupt das Array einliest bevor Thread1 nicht damit fertig ist.
Aber wenn der Fall eh nicht eintreten kann, faellt mir kein Grund fuer ein Mutex ein, aber irgendwie find ich's auch nicht ganz "sauber".
marko1 schrieb:
grund: soll ich zb 2000 arrays per hand erstellen?
Erstellst du denn die 2000 Threads von Hand?
