2015-06-08 14 views
16

Ponylang è un nuovo linguaggio che è privo di blocco e privo di datarace. La mia impressione è che per fare ciò, Ponylang guarda la frase "se due thread possono vedere lo stesso oggetto, quindi scrive deve proibire qualsiasi altra operazione da un altro thread", e usa un sistema di tipi per far rispettare i vari casi speciali. Ad esempio, esiste un descrittore di tipi che dice "nessun altro thread può vedere questo oggetto" e uno che dice "questo riferimento è di sola lettura" e vari altri. Devo ammettere che la mia comprensione di questo è piuttosto scarsa, e la documentazione di ponylang è a corto di esempi.Quali costrutti non sono possibili usando il modello senza serratura di Ponylang?

La mia domanda è: ci sono operazioni possibili con un linguaggio basato su lock che non sono del tutto traducibili nel sistema basato sul tipo di Ponylang? Inoltre, ci sono operazioni simili che non sono traducibili nei costrutti efficienti nel ponylang?

+0

Sembra "troppo ampio" per lo stack overflow per me. IMO, puoi avere solo due di "deadlock-free", "race-free" e "shared". –

risposta

0

Credo che possa fare qualsiasi cosa che un blocco condiviso possa fare. con solo gli oggetti iso e consume è fondamentalmente un sistema di passaggio di messaggi che può fare tutto ciò che fa un sistema di blocco. Come in mach3 puoi fare tutto ciò che Linux può fare.

1

[...] ci sono operazioni possibili con un linguaggio basato su lock che non sono affatto traducibili nel sistema basato sul tipo di Ponylang?

Il punto con funzionalità di riferimento, a Pony, è quello di impedire di fare le cose che sono possibili e persino banale, in altre lingue, come la condivisione di un elenco tra due thread e aggiungere elementi ad esso contemporaneamente. Quindi, sì, in linguaggi come Java, puoi condividere i dati tra i thread in un modo che è impossibile in Pony.

Inoltre, ci sono operazioni che non sono traducibili in costrutti efficienti in ponylang?

Se stai chiedendo se i blocco basati lingue possono essere più efficienti in alcune situazioni, di pony, allora io la penso così. Puoi sempre creare una situazione che benefici di N thread e 1 lock ed è peggio quando usi il modello di attore che ti obbliga a passare informazioni nei messaggi.

Questa cosa non è vedere il modello dell'attore come superiore in tutti i casi. È un modello diverso di concorrenza e i problemi sono risolti in modo diverso. Ad esempio, per calcolare i valori N e accumulare i risultati in un elenco:

  • In un thread-modello che ci si
    1. creare un pool di thread,
    2. creare lista thread-safe,
    3. Creare N attività che condividono l'elenco e
    4. attendere il completamento di N task.
  • In un modello attore si farebbe
    1. creare un attore di un avviso per i valori N,
    2. creare N attori B condividendo l'attore A e
    3. attesa per un per produrre un elenco .

Ovviamente, ogni compito sarebbe aggiungere un valore alla lista e ogni attore B avrebbe mandato il valore con l'attore A. A seconda di come i messaggi sono passati tra gli attori, può essere un più lento per inviare i valori N che per bloccare N volte. Normalmente sarà più lento ma, d'altra parte, non otterrai mai una lista con una dimensione inaspettata.

Problemi correlati