2016-09-01 4 views
1

Wenn es mehrere Threads gibt, die eine Funktion durchlaufen, gibt es darin eine for-Schleife mit variabler Zuweisung. Wie werden Variablenwerte nicht über mehrere Threads verteilt?Wie wird Speicher in Threads verwaltet?

+0

Der Speicher wird nicht durcheinander gebracht, wenn sich der * gleiche * Thread in der Mitte von zwei Ausführungen derselben Funktion befindet (z. B. wenn die Funktion rekursiv ist). Warum würde es durcheinander kommen, wenn zwei Threads die Funktion ausführen würden? – user2357112

+1

Wollten Sie sich auf die lokalen Variablen der Funktion beziehen, auf die nur der Code dieser Funktion zugreifen kann, oder auf globale Variablen, auf die jeder andere Code im gesamten Programm zugreifen kann? Wenn Sie lokale Variablen meinen, dann erhält jeder Thread eine Kopie davon. Wenn Sie globale Variablen meinen, können mehrere Threads ihre Werte durcheinander bringen, es sei denn, Sie treffen natürlich besondere Vorsichtsmaßnahmen. –

+0

Das gleiche wie wenn ein einzelner Thread die gleiche Funktion zweimal durchläuft, z. B. durch Rekursion. –

Antwort

0

Jeder Thread hat einen Speicherblock namens "thread stack", von etwa 1 MB für 32 Bits und 4 MB für 64 Bits, wo Werttypen und Referenzen (Zeiger auf den Haufen), die Parameter oder Zwischenergebnisse sind gespeichert sind; Dieser Bereich wird nicht über Threads geteilt. Der Rest der Dinge (z. B. gemeinsame Werttypen und Referenzen und die Objekte, auf die Referenzen verweisen können) werden im Heapspeicher gespeichert, dh im restlichen RAM-Speicher, und er wird für alle Threads freigegeben.

Werte können z. B. unter Rennbedingungen über die Gewinde verteilt werden. Wenn Sie versuchen, einen 64-Bit-Wert aus mehreren Threads mit einer 32-Bit-CPU zu aktualisieren, könnten Sie eine Inkonsistenz erhalten, um zu verhindern, dass Sie in .NET viele Synchronisierungsprimitive wie beispielsweise die Dienstprogramme Interlock und Monitor haben. Auch nicht thread-sichere Objekte wie List<> können durcheinander geraten, wenn mehrere Threads ohne Synchronisation verwendet werden, und eine einfache Ganzzahlinkrementierung kann Werte verlieren, wenn die Operation nicht atomar ist.

Sie sollten etwas lesen. Ich empfehle Ihnen das Buch CLR via C# von Jeffrey Richter. Jeder .NET Entwickler sollte dieses Buch tatsächlich lesen.

Verwandte Themen