Wie haben zwei oder mehrere threads teilen Speicher auf dem heap, die Sie reserviert haben?
Wie der Titel sagt, wie zwei oder mehrere threads teilen Speicher auf dem heap, die Sie reserviert haben? Ich habe darüber nachgedacht, und ich kann nicht herausfinden, wie Sie es tun können. Hier ist mein Verständnis von dem Prozess, vermutlich bin ich irgendwo falsch.
Jedem thread können hinzufügen oder entfernen Sie eine bestimmte Anzahl von bytes auf dem heap, indem Sie ein system nennen, das gibt einen Zeiger auf diese Daten, vermutlich durch schreiben in ein register, das der thread kann dann die Kopie auf den stack.
Also zwei threads A und B zuweisen kann, wie viel Speicher, wie Sie wollen. Aber ich sehe nicht, wie Ein thread wissen konnte, wo die Erinnerung, dass thread B zugeteilt hat liegt. Noch weiß ich, wie entweder thread wissen konnte, wo die anderen thread-stack liegt. Multi-threaded-Programme teilen sich den heap und ich glaube, Sie kann ein Zugang zu anderen Stapel, aber ich kann nicht herausfinden, wie.
Ich habe versucht, die Suche für diese Frage fand aber nur sprachspezifische Versionen, abstrahieren die details.
Bearbeiten:
Ich versuche nicht zu Sprache oder OS-spezifisch, aber ich bin mit Linux und bin es bei der Suche von einem niedrigen Niveau, Perspektive, Montage, denke ich.
Nein, ich denke nicht so. Ich sah, dass einer während der Suche und es nicht zu Fragen, wie die threads teilen sich den heap nur, wenn Sie tun. Ich will genau wissen, wie sich threads Daten austauschen. Was ist der Mechanismus der Kommunikation? Ich denke, Sie teilen Zeiger auf den Speicher, aber ich weiß nicht, wie Sie es tun.
Wie kann ich Bearbeiten, meine Frage für beste Klarheit? Was am meisten verwirrend daran? Usr hat meine Frage beantwortet, aber ich möchte sicherstellen, dass meine Frage verständlich für andere, und jetzt es scheint nicht sehr sauber zu mir.
InformationsquelleAutor Lemma Prism | 2012-08-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine interpretation deiner Frage: Wie kann Ein thread, ein Zeiger auf den Speicher-B ist mit? Wie können Sie exchange-Daten?
Antwort: Sie beginnen in der Regel mit einem gemeinsamen Zeiger auf einen gemeinsamen Speicherbereich. Das ermöglicht Ihnen den Austausch von anderen Daten, einschließlich Verweise auf andere Daten mit jedem anderen.
Beispiel:
p
p
Ihnenp
und die Arbeit an den Daten gezeigt, durchp
Und in einer realen Programmiersprache (C#) sieht das so aus:
Threads in der Regel nicht auf der jeweils anderen Stapel. Alles beginnt von einem Zeiger, der an die thread-Prozedur.
Erstellen eines Threads ist eine OS-Funktion. Es funktioniert wie folgt:
Und das ist, wie someData kommt in ThreadProc. Dies ist übrigens die erste, die anfänglichen Daten im Element freigegeben ist. Die Schritte 1-3 werden synchron ausgeführt, das von der übergeordneten thread. 4 geschieht auf der Kind-thread.
Ich habe eine Antwort auf Ihren Kommentar.
Ok, also der Mechanismus, mit dem mehrere threads kommunizieren kann, wird eingeleitet durch drücken von vordefinierten Daten (in der Regel Zeiger ich mir vorstellen) auf dem thread-stack während der thread-Erstellung über die OS Funktion, die die Argumente. Danke! Das beantwortet meine Frage, aber ich werde warten Sie einen Tag oder zwei, bevor Sie tatsächlich akzeptieren einer Antwort, falls jemand meint, eine bessere oder klarere Antwort. Dies ist ausreichend für meine Zwecke, sondern aus Neugierde, können Sie die OS-Funktion, noch mehr Daten-push auf den stack? Außerdem ist das ein OS-spezifischen Mechanismus oder Windows-oder Linux-es anders machen?
Theoretisch ist OS spezifisch, aber in der Praxis ist dies der einzige Weg.; Ein Zeiger ist immer genug da, Sie können das Zeiger auf eine beliebige struct enthält alles. Ein thread-pool-thread möglicherweise einen ptr auf a (synchronisiert) Arbeit Warteschlange. Die Benutzer-Modus-Entwickler setzen können beliebige Wrapper on top of, die einfache API. C# können Sie auch das bestehen in einer closure-Objekt implizit. Das ist ein ziemlich mächtigen wrapper verstecken alles, was ich eben beschrieben habe. Beispiel:
{ int x = 0; new Thread(() => { x++; }); }
einfach Nur funktioniert und alle built on top of, die einfache API.Ein Zeiger ist genug, ja, aber kann Sie weitere Daten hinzufügen? Ich bin nur neugierig, ob Betriebssysteme erlauben es. In der Praxis ist es wirklich egal, so oder so da, wie Sie meinte, einer reicht.
InformationsquelleAutor usr
Eine ganz kurze Antwort aus einer Vogelperspektive (1000 Meilen oben):
Threads sind Ausführungspfade des gleichen Prozesses, und der Haufen gehört eigentlich der Prozess (und als Folge von threads gemeinsam genutzt). Die einzelnen threads nur braucht seinen eigenen stack, die als separate Einheit funktionieren.
InformationsquelleAutor Cratylus
Threads können Speicher freigeben, auf einem Haufen, wenn Sie beide den gleichen heap. Standardmäßig sind die meisten Sprachen/frameworks ein einzelnes Standard-heap-code verwenden können, um Speicher auf dem heap. In nicht verwalteten Sprachen, die Sie in der Regel explizite Aufrufe zu zuordnen heap-Speicher. In C, das könnte
malloc
usw. zum Beispiel. In verwalteten Sprachen-heap ist in der Regel automatische und wie die Zuteilung erfolgt, hängt von der Sprache-in der Regel durch die Nutzung dernew
Betreiber. aber das kommt etwas auf den Kontext. Wenn Sie das Betriebssystem oder die Sprache Kontext-du fragst nach, vielleicht kann ich mehr Details.InformationsquelleAutor Peter Ritchie
Einen Thread mit den anderen threads desselben Prozesses: der code-Abschnitt, Abschnitt Daten und andere Betriebssystem-Ressourcen wie geöffnete Dateien und Signale.
InformationsquelleAutor Saurabh Juneja