Mein naiver Versuch war, so etwas zu tun:
import std.typecons : Proxy:
synchronized class Array(T)
{
static import std.array;
private std.array.Array!T data;
mixin Proxy!data;
}
Leider funktioniert es nicht wegen https://issues.dlang.org/show_bug.cgi?id=14509
Kann ich nicht sagen, dass mir sehr überrascht, obwohl als automagischen Umgang mit multi- Threading über versteckte Mutexe ist in modernen D sehr unidiomatisch und das Konzept synchronisierter Klassen ist meist ein Relikt aus D1-Zeiten.
Sie können die gleiche Lösung natürlich manuell implementieren, indem Sie eine eigene SharedArray
Klasse mit allen notwendigen Methoden definieren und Sperren innerhalb der Methoden hinzufügen, bevor Sie interne private einfache Methoden aufrufen Array
. Aber ich nehme an, Sie wollen etwas, das mehr aus der Box funktioniert.
Kann nichts besseres hier und jetzt erfinden (wird mehr darüber nachdenken), aber es ist erwähnenswert, dass es in D im Allgemeinen ermutigt wird, Datenstrukturen für den expliziten Umgang mit gemeinsamem Zugriff zu erstellen, statt nur normale Daten zu schützen Strukturen mit Mutexen. Und natürlich ist der am meisten unterstützte Ansatz, keine Daten gemeinsam zu nutzen, sondern stattdessen die Nachrichtenübermittlung zu verwenden.
Ich werde die Antwort aktualisieren, wenn etwas besser in meinen Sinn kommt.
das Array Schutz selbst einfach ist. Sie müssen nur eine Wrapper-Struktur erstellen, in der alle Array-Funktionen und Operatoren überladen sind und alle Funktionen synchronisiert sind. Das Problem besteht darin, an die Elemente des Arrays selbst heranzukommen. Auch diese zu schützen wird sehr viel komplizierter, da sie, sobald sie von einer Funktion wie 'opIndex' zurückgegeben werden, nicht mehr geschützt sind ... –
Ich dachte, das ist was 'shared (T [])' angenommen wurde zu tun, aber anscheinend nicht .... –
@ AdamD.Ruppe Alle geteilten wirklich tut es, damit die Variable über Threads geteilt wird, anstatt thread-local zu sein. Es gibt ein paar Fälle, in denen der Compiler sich beschweren wird, wenn Sie versuchen, mit Shared zu arbeiten, was garantiert ein Problem darstellt (in einigen Fällen mit atomaren Operationen IIRC verbunden), aber nichts mit Mutexe oder Synchronisation macht. Das liegt an dir. Synchronisierte Klassen sind der empfohlene Weg, um gemeinsam genutzte Objekte zu behandeln, aber sie sind nicht vollständig implementiert (nur synchronisierte Funktionen) und alles, was dieser Klasse entgeht, wird nicht mehr geschützt. –