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?
Antwort
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.
- 1. Wie wird der Speicher in Python verwaltet?
- 2. Wie man Speicher verwaltet?
- 3. Wie wird der Code-Speicher verwaltet?
- 4. Wie verwaltet ptr_vector Speicher?
- 5. Wie wird dynamischer Speicher in std :: vector verwaltet?
- 6. Wie wird die Ausführung eines einzelnen Threads ordnungsgemäß verwaltet?
- 7. Wie verwaltet man Ergebnisse von Python-Threads?
- 8. Wie man den Rückgabewert eines Threads verwaltet?
- 9. Wie wird der von A-Frame verwendete Speicher verwaltet?
- 10. Wer verwaltet die Threads in Java?
- 11. Wiederverwendbare Liste, die Speicher verwaltet
- 12. Wie verwaltet Apache Artemis Heap-Speicher (RAM)
- 13. __int64 vs int - Speicher verwaltet
- 14. Boost verwaltet gemeinsamer Speicher segfault
- 15. Wie verwaltet Qt QML Javascript Speicher?
- 16. Wird Visual C++ - Speicher vom Dot Net-Framework verwaltet?
- 17. Wie werden persistente Mehrfach-Threads eingerichtet und verwaltet?
- 18. Perl Speicherverlust in Threads (Threads nicht Speicher freigeben)
- 19. Wie werden Threads von der HttpApplication erstellt und verwaltet?
- 20. Wie verwaltet die Joblib Parallel-Funktion den Speicher?
- 21. Wie wird die Kapazität mit Trello verwaltet?
- 22. Wie wird häufig geänderter Produktionscode verwaltet?
- 23. Wie Qt den Speicher eines Widget-Zeigers verwaltet, der von der Funktion QItemDelegate :: createEditor() zurückgegeben wird
- 24. Wie wird der Speicher verwaltet, nachdem eine seichte Kopie erstellt wurde?
- 25. Warum teilen Threads den Heap-Speicher?
- 26. Wie kann man den Speicher freigeben, der von boost fast_pool_allocator verwaltet wird?
- 27. Wie Stack oder Speicher für Threads unter dem gleichen Prozess in Linux zugewiesen wird
- 28. Wird C# unsicherer Code verwaltet?
- 29. Wird der OLEDB-Provider verwaltet oder nicht verwaltet?
- 30. Wie verwaltet sqlite3 SELECT-Abfragedaten?
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
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. –
Das gleiche wie wenn ein einzelner Thread die gleiche Funktion zweimal durchläuft, z. B. durch Rekursion. –