Отказ от ответственности: Это можно легко сделать, используя MVar()
в качестве простого мьютекса. Я просто любопытно посмотреть, можно ли это сделать с помощью STM.Можно ли это сделать с помощью STM?
Я хочу сделать следующее атомарно:
Прочитайте некоторые переменные.
Решите, какие операции ввода/вывода выполнять, исходя из того, что я только что прочитал.
Выполнение ввода-вывода.
Запишите результаты в переменных.
Для конкретности, предположим, что я хочу, чтобы отслеживать, сколько байтов ввода я прочитал, и делать вид, что я достиг EOF после того, как определенное количество байтов израсходованы. (ОК, позволяя двум потокам читать один и тот же файл одновременно, вероятно, является фальшивой вещью, чтобы сделать это в первую очередь, но пойдите со мной на этом ...)
Очевидно, что это не может быть одна транзакция STM; есть входы/выходы в середине. Очевидно, было бы также неправильно иметь это как две несвязанные транзакции. (Два потока могли видеть, что есть один байт квоты слева, и оба решили прочитать этот байт.)
Есть ли хорошее решение этой проблемы? Или STM просто неправильный инструмент для этой задачи?
Это дает вам то, что вам нужно? «Парикмахер» может быть вашим указателем на чтение. http://stackoverflow.com/questions/16933678/are-tchan-writes-integrated-into-haskell-stm –
@ DaxFohl Ну, вы _could_ используете STM для отправки всех запросов ввода-вывода в один поток через «TChan '... это должно сработать. – MathematicalOrchid
Похоже, у вас есть стандартный прецедент для основного решения модели актера в стиле Эрланг, что и реализует вещи парикмахера через «STM» и «TChan». –