Disclaimer: Questo può essere fatto facilmente utilizzando un MVar()
come un mutex semplice. Sono solo curioso di vedere se può essere fatto con STM.Questo può essere fatto con STM?
voglio fare quanto segue atomicamente:
Leggi alcune variabili.
Decidere quale I/O eseguire, in base a ciò che ho appena letto.
Eseguire l'I/O.
Registrare i risultati nelle variabili.
Per concretezza, supponiamo che io voglio tenere traccia del numero di byte di ingresso che ho letto, e fingo ho raggiunto EOF dopo un certo numero di byte è stato consumato. (OK, lasciare che due thread leggano dallo stesso file contemporaneamente è probabilmente una cosa fasulla da fare in primo luogo, ma vieni con me su questo ...)
Chiaramente questo non può essere una singola transazione STM; c'è l'I/O nel mezzo. Chiaramente sarebbe anche sbagliato averlo come due transazioni non connesse. (Due thread potrebbero vedere che rimane un solo byte di quota ed entrambi decidono di leggere quel byte)
C'è una bella soluzione a questo problema? O STM è semplicemente lo strumento sbagliato per questo compito?
Questo ti dà quello che ti serve? Il "barbiere" potrebbe essere il tuo puntatore di lettura. http://stackoverflow.com/questions/16933678/are-tchan-writes-integrated-into-haskell-stm –
@DaxFohl Bene, puoi _utilizzare STM per inviare tutte le richieste di I/O a un singolo thread tramite un 'TChan "... che dovrebbe funzionare. – MathematicalOrchid
Sembra che tu abbia un caso d'uso standard per la soluzione modello di base in stile Erlang, che è ciò che la cosa del barbiere implementa tramite 'STM' e' TChan'. –