Wenn ich atomar sagte, meinte ich, dass Befehle ohne Kontextwechsel () in einen anderen Thread desselben Prozesses (andere Arten von Switches müssen natürlich ausgeführt werden) ausgeführt werden. Die einzige Lösung, die ich gefunden habe, besteht darin, alle Threads außer aktuell ausgeführt vor dem Teil zu suspendieren und sie danach wieder aufzunehmen. Irgendein eleganterer Weg?
Der Grund, warum ich das tun möchte, besteht darin, einen kohärenten Zustand von Objekten zu sammeln, die auf mehreren Threads laufen. Ihr Code kann jedoch nicht geändert werden (sie sind bereits kompiliert), daher kann ich keine Mutexe, Semaphore usw. darin einfügen. Die atomare Operation ist natürlich das Sammeln von Zuständen (d. H. Das Kopieren einiger Variablen).
Es gibt einige atomare Operationen in der Interlocked Klasse, aber es bietet nur ein paar sehr einfache Operationen. Es kann nicht verwendet werden, um einen ganzen atomaren Block von Code zu erstellen.
Ich würde empfehlen, das Sperren sorgfältig zu verwenden, um sicherzustellen, dass der Code auch dann noch funktioniert, wenn sich der Kontext ändert.
Nun, Sie können Sperren verwenden, aber Sie können Kontextwechsel nicht genau verhindern. Wenn Ihre Threads jedoch für dasselbe Objekt gesperrt sind, werden die wartenden Threads offensichtlich nicht ausgeführt, sodass kein Kontextwechsel erforderlich ist, da nichts ausgeführt werden muss.
Vielleicht möchten Sie sich auch diese Seite ansehen.
Es ist möglich, einen globalen Zustand aus einem gemeinsamen Speicher zu erhalten, der aus einer Sammlung (Array) von atomaren Ein-Leser / Multi-Schreiber-Registern besteht. Die Lösung ist einfach, aber nicht trivial. Sie können den Algorithmus lesen, der in der Veröffentlichung "atomare Schnappschüsse des geteilten Gedächtnisses" veröffentlicht wurde, oder Sie können das Kapitel 4 aus der Kunst des multiprocessor Programmierbuches lesen, dort können Sie natürlich Ideen über die Implementierung auf der Java-Sprache bekommen, sobald Sie sind vertraut mit der Idee, dass Sie in der Lage sein sollten, es in eine andere Sprache zu transportieren. Entschuldigung, wenn mein Englisch nicht gut genug ist.
Tags und Links c# multithreading