Tutto ciò che fa un thread è un'operazione di interleave in modo che parti del processo sembrino sovrapporsi nel tempo. Una macchina single-core con più thread salta semplicemente intorno: esegue piccoli bit di codice da un thread, quindi passa a un altro thread. Un semplice programma di pianificazione decide quale thread ha la massima priorità e viene effettivamente eseguito nel core.
Su un computer single-core, niente accade effettivamente "allo stesso tempo". È solo un'esecuzione interlacciata.
Ci sono molti, molti modi per ottenere interleaving. Molti.
Supponiamo che tu abbia un semplice processo a due thread che utilizza un semplice blocco in modo che entrambi i thread possano scrivere su una variabile comune. Hai sei blocchi di codice.
- T1-prima del blocco
- T1-con blocco
- T1-dopo il blocco
- T2-prima del blocco
- T2-con blocco
- T2-dopo il blocco
[Questo può essere in loop o avere più lock o altro. Tutto ciò che fa è diventare più lungo, non più complesso.]
I passi di T1 devono essere eseguiti nell'ordine (T1-before, T1-con, T1-after) e i passi di T2 devono essere eseguiti nell'ordine (T2-before, T2-with, T2-after).
Oltre al vincolo "in-order", questi possono essere interfogliati in qualsiasi modo. Comunque. Potrebbero essere eseguiti come elencato sopra. Un altro ordine valido è (T1-before, T2-before, T2-lock, T1-lock, T2-after, T1-after). Ci sono molti ordini validi.
Attendere.
Questa è solo una macchina a stati con sei stati.
È un automa a stati finiti non deterministici. L'ordinamento degli stati T1-xxx con stati T2-xxx è indeterminato e non ha importanza. Quindi ci sono posti in cui il "prossimo stato" è un lancio di monete.
Ad esempio, quando inizia l'FSM, T1-before o T2-before sono entrambi i primi stati legittimi. Lancia una moneta.
Diciamo che è apparso T1-before. Fai quello. Quando ciò è fatto, c'è una scelta tra T1-with e T2-before. Lancia una moneta.
Ad ogni passo del FSM ci saranno due scelte (due discussioni - due scelte) e un lancio della moneta può determinare quale stato specifico è seguito.