Utilizzo di tipi di unicità per implementare un parallelismo sicuro


19

Sono stato interessato ai tipi di unicità come alternativa alle monadi in linguaggi puramente funzionali; sfortunatamente, questa è una specie di area esoterica della ricerca CS e le risorse online sulla programmazione con tipi di unicità sono poche e lontane tra loro.

È ovvio come i tipi di unicità possano essere utilizzati per implementare strutture di dati stateful come riferimenti ("box") e array, anche se mi sfugge come è possibile implementare altre strutture di dati stateful comuni con loro.

È possibile implementare, ad esempio, il blocco con tipi univoci? I tipi di unicità possono essere utilizzati per condividere dati mutabili tra thread? È possibile utilizzare tipi univoci per creare primitive di sincronizzazione (come i mutex) o è necessario il passaggio dei messaggi?


Puoi rendere la tua domanda un po 'più specifica? Cosa, ad esempio, sai già riguardo al blocco con tipi unici e dove la tua conoscenza è insufficiente?
Robert Harvey,

> Che cosa sai, ad esempio, del blocco con tipi univoci già non so nulla del blocco con tipi univoci - non so davvero come il parallelismo sicuro funzioni con tipi univoci e vorrei sapere se ci sono risorse sull'argomento.
Ricky Stewart,


2
@RickyStewart: probabilmente conosci già Clean ( wiki.clean.cs.ru.nl/Clean ). Volevo solo aggiungere il link perché non lo hai menzionato.
Giorgio,

Penso che dovresti esaminare i tipi lineari per il parallelismo. I tipi di unicità IIRC sono costruiti su tipi lineari. Frank Pfenning ha alcune cose interessanti sull'argomento
Daniel Gratzer,

Risposte:


2

È possibile implementare, ad esempio, il blocco con tipi univoci?

Ho seguito il link fornito da Robert Harvey e ho fatto una rapida lettura. Non posso dire di aver capito tutto o di avere un alto livello di fiducia nel capire veramente quello che penso di aver capito, ma mi sembra che l'intero punto di unicità esterna e l'immutabilità di riferimento non abbia bisogno di essere bloccato.

I moderni approcci al multithreading cercano di evitare il blocco perché solo i programmatori di grande esperienza possono scrivere codice che utilizza il blocco e anche il loro codice è molto incline ad avere bug. Se si aggiunge al fatto che il codice di blocco è praticamente non verificabile, dovrebbe essere ovvio che si tratta di un modo altamente indesiderabile di fare le cose, e qualsiasi soluzione che miri a liberarci dal blocco promette a dir poco.

Il modo in cui abbiamo evitato il blocco è con il passaggio dei messaggi, il che richiede che i messaggi debbano essere immutabili. All'incirca, (a prima vista), l'immutabilità di riferimento sembra essere una tecnica che può aiutarci a garantire l'immutabilità senza dover effettivamente costruire tipi immutabili, e l'unicità esterna sembra essere una tecnica che può aiutarci a rilassare il rigoroso requisito di immutabilità a livello locale.

I tipi di unicità possono essere utilizzati per condividere dati mutabili tra thread?

Il documento non lo affermava chiaramente, ma da quello che ho capito, un cluster di oggetti esternamente unico è sicuro per i thread perché in qualche modo (davvero, come? ) È garantito che esista un solo riferimento esterno in quel cluster di oggetti, il che significa che un thread che riceve un tale riferimento può considerare gli oggetti referenziati come mutabili senza doversi preoccupare che anche qualche altro thread possa mutarli, poiché nessun altro thread può avere un altro riferimento. Sarei curioso di sapere come un tale costrutto teorico possa essere implementato e applicato.

È possibile utilizzare tipi univoci per creare primitive di sincronizzazione (come i mutex) o è necessario il passaggio dei messaggi?

Ancora una volta, da quello che ho capito, i tipi unici esternamente e l'immutabilità di riferimento hanno lo scopo di rendere inutili serrature, mutex e simili. Il passaggio dei messaggi sembra essere la strada da percorrere, e va bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.