risposta

25

Quando si tratta di valori puri, l'ordine di valutazione non ha importanza. Questo è essenzialmente il parallelismo : Valutazione di valori puri in parallelo. Al contrario dei valori puri, l'ordine di solito è importante per le azioni con effetti collaterali. L'esecuzione simultanea delle azioni è denominata simultanea.

Ad esempio, considerare le due azioni putStr "foo" e putStr "bar". A seconda dell'ordine in cui vengono valutate queste due azioni, l'output è "foobar", "barfoo" o qualsiasi stato intermedio. L'output è indeterministico in quanto dipende dall'ordine specifico di valutazione.

Come altro esempio, considerare i due valori sum [1..10] e 5 * 3. Indipendentemente dall'ordine in cui questi due vengono valutati, si riducono sempre agli stessi risultati. Questo determinismo è qualcosa che solitamente si può garantire solo con valori puri.

+22

+1; in altre parole, il parallelismo è un'ottimizzazione; la semantica cambia la concorrenza. – ehird

+3

@ehird Sì. Questo è perfettamente quello che ho cercato di trasmettere. – fuz

+0

In lang oz: 1 valore di flusso di dati può essere associato solo una volta 2 il valore di utilizzo del programma di utilizzo dovrebbe essere in attesa finché non è stato associato. Quindi il comportamento è deterministico quando due thread utilizzano uno stesso valore di flusso di dati. – jiamo

24

Concorrenza e parallelismo sono due cose diverse.

Concorrenza significa che più thread interagiscono in modo non deterministico. Ad esempio, potresti avere un server di chat in cui ogni client viene gestito da un thread. Il non-determinismo è essenziale per il sistema che stai cercando di modellare.

Il parallelismo riguarda l'utilizzo di più thread per semplificare l'esecuzione del programma. Tuttavia, il risultato finale dovrebbe essere esattamente lo stesso di se si esegue l'algoritmo in sequenza.

Molte lingue non hanno primitive per il parallelismo, quindi è necessario implementarlo utilizzando le primitive della concorrenza come i thread e i blocchi. Tuttavia, ciò significa che il programmatore deve fare attenzione a non introdurre accidentalmente non determinismo indesiderato o altri problemi di concorrenza. Con primitive del parallelismo esplicito come par e pseq, molte di queste preoccupazioni vanno semplicemente via.

+2

Questa è ... una * veramente * buona spiegazione. Grazie. –