Il mio tentativo ingenuo è stato quello di fare qualcosa di simile:
import std.typecons : Proxy:
synchronized class Array(T)
{
static import std.array;
private std.array.Array!T data;
mixin Proxy!data;
}
Purtroppo, non funziona a causa di https://issues.dlang.org/show_bug.cgi?id=14509
Non posso dire che sono molto sorpreso se la manipolazione come automagiche di multi- il threading tramite mutex nascosti è molto unidiomatico nella moderna D e il concetto stesso di classi sincronizzate è in gran parte un relitto di D1 volte.
È possibile implementare la stessa soluzione manualmente, ovviamente, definendo la propria classe SharedArray
con tutti i metodi necessari e aggiungendo blocchi all'interno dei metodi prima di chiamare i metodi interni privati di plain Array
. Ma presumo che tu voglia qualcosa che funzioni di più fuori dagli schemi.
Impossibile inventare qualcosa di meglio qui e ora (ci penserò di più) ma vale la pena notare che in generale è incoraggiato in D creare strutture dati progettate per gestire l'accesso condiviso in modo esplicito invece di proteggere solo i dati normali strutture con mutex. E, naturalmente, l'approccio più incoraggiato è quello di non condividere i dati con il passare del messaggio.
aggiornerò la risposta se mi viene in mente qualcosa di meglio.
fonte
2015-04-27 02:19:23
Proteggere la matrice stessa è facile. Devi solo creare una struttura wrapper con tutte le funzioni dell'array e gli operatori sovraccarichi e dove tutte le funzioni sono sincronizzate. Il problema è ottenere gli elementi dell'array stesso. Proteggere anche quelli diventa molto più complicato, dal momento che non appena li restituisci da una funzione come 'opIndex', non sono più protetti ... –
Ho pensato che questo fosse ciò che' shared (T []) 'era supposto da fare, ma apparentemente non ... –
@ AdamD.Ruppe Tutto ciò che è realmente condiviso è fare in modo che la variabile sia condivisa tra thread piuttosto che thread-local. Ci sono alcuni casi in cui il compilatore si lamenterà se si tenta di fare cose condivise che è garantito essere un problema (in alcuni casi correlato alle operazioni atomiche IIRC), ma non fa nulla con mutex o sincronizzazione. Dipende da te. Le classi sincronizzate sono il modo consigliato per gestire gli oggetti condivisi, ma non sono completamente implementate (solo funzioni sincronizzate) e qualsiasi cosa sfugga a quella classe non sarà più protetta a prescindere. –