Ist ein Array Threadsicher?



  • Hallo, ich habe 2 Treads, die über einen Zeiger auf ein mit new erzeugtes Array zugreifen. Sie greifen jedoch auf garantiert verschiedene Bereiche zu.

    Bei Array der Länge n, greift Thread 1 auf 0 bis m zu und Thread 2 auf m+1 bis n-1 zu. Ist dies Threadsicher, oder gibt es irgendwas gemeinsammes beim Zugriff auf Arrays, das Probleme verursachen könnte?



  • Ich spreche ohne Erfahrung:

    Ich denke das Array an sich ist Thread-safe und sollte für Built-in-Types keine Probleme bereiten. Hast du jedoch ein Array aus Objekten muss natürlich das Objekt in sich Thread-Safe sein.

    Gruß



  • Wenn Du z.B. 2 Threads und ein Array mit 8 Elementen hast, wobei jeder Thread auf seine 4 Elemente zugreift, dann kann doch nix passieren. Erst wenn beide auf die selben Elemente zugreifen wirds spannend. Dann ist auch ein Array nicht threadsicher, weil der Zugriff (Wert holen, ändern, Wert setzen) kein atomarer Vorgang ist...



  • Airdamn schrieb:

    Wenn Du z.B. 2 Threads und ein Array mit 8 Elementen hast, wobei jeder Thread auf seine 4 Elemente zugreift, dann kann doch nix passieren. Erst wenn beide auf die selben Elemente zugreifen wirds spannend. Dann ist auch ein Array nicht threadsicher, weil der Zugriff (Wert holen, ändern, Wert setzen) kein atomarer Vorgang ist...

    Das hoffe ich. Ich hatte nur gedacht, das eventuell intern (in Windows) oder sonst wo vieleicht ein Array eben nicht Thread sicher ist, obwohl nur auf verschiedene Bereiche zugegriffen wird, da es ja auch irgendwie eine Verwaltung geben muß, die außrechnet, an welcher stelle im echten Speicher sich ein Bestimmtes Ellement des Array befindet. Wenn dies nicht Threadsicher währe, könnten falsche Speicherstellen errechnet werden.

    Das Problem ist nun, das wenn ich es implementiere kann es 100000000 mal gutgehen und dann erste der Fehler auftreten.

    Kann Jemand eine definitive Aussage treffen?



  • Hi,du solltest dir unbedingt einmal das Buch WIN32 Multithreaded Programming aus dem O'Reilly Verlag besorgen.Es kann sein das der Titel geringfügig anders lautet-ich weiß es nicht mehr so genau und habs' länger nicht gelesen.....Außerdem dürfte es nicht mehr im Buchahandel erhältlich sein aber vielleicht findest du es ja bei ABEBOOKs.DE oder so....auf jeden Fall: ist es nicht die Frage ob das Array oder sonstwas wo du deine Daten reinpackst sicher ist.....Die Frage ist doch ist die Mimik deiner Threads sicher die auf die Daten zugreift/greifen!Dsa Betriebssystem (Windows,Unix etc.) schaltet alle paar tausendstel Sekunde von einem Thread zum anderen (bestimmt schomma gehört)und zu diesem Zeitpunkt muß der alte Zustand wieder hergestellt sein der zum Zeitpunkt des Threadswitches vorlag.Ist dies nicht der Fall kommt es unweigerlich zu dem Fehler den du vermeindlich als eine falsche Initialisierung deiner Arrays angesehen hast;so vermutet ich jedenfalls.....Array oder sonstige Datenkonstrukte ind entweder global oder lokal gültig d.h. du kannst entweder innerhalb des ganzen Programms auf sie zugreifen oder nur innerhalb einer Funktion/Methode.(Unterschied?...beim nächsten Mal...) 🙂



  • mal davon abgesehen... wenn ohnehin jeder thread nur das halbe array benutzt, warum nimmste nicht zwei getrennte arrays?


Anmelden zum Antworten