Отказ от ответственности: это легко можно сделать, используя MVar ()
как простой мьютекс. Я просто любопытно посмотреть, можно ли это сделать с помощью STM.
Я хочу сделать следующее атомарно:
-
Прочитайте некоторые переменные.
-
Решите, какой I/O выполнить, на основе того, что я только что прочитал.
-
Выполните ввод/вывод.
-
Запишите результаты в переменных.
Для конкретности предположим, что я хочу отслеживать, сколько байтов ввода я прочитал, и притвориться, что я достиг EOF после того, как было потрачено определенное количество байтов. (ОК, позволяя двум потокам читать один и тот же файл одновременно, вероятно, является фальшивым, что нужно сделать в первую очередь, но пойдите со мной на этом...)
Очевидно, что это не может быть одна транзакция STM; там I/O посередине. Очевидно, было бы также неправильно иметь это как две несвязанные транзакции. (Два потока могли видеть, что остался один байт квоты, и оба решили прочитать этот байт.)
Есть ли хорошее решение этой проблемы? Или STM просто неправильный инструмент для этой задачи?