这可以用STM完成吗?

Mat*_*hid 10 haskell stm

免责声明:这可以使用MVar ()简单的互斥锁轻松完成.我只是想知道它是否可以用STM完成.

我想原子地做以下事情:

  • 阅读一些变量.

  • 根据我刚刚阅读的内容决定要执行的I/O.

  • 执行I/O.

  • 将结果记录在变量中.

具体来说,假设我想跟踪我已读取的输入字节数,并假设在消耗了一定数量的字节后达到了EOF.(好吧,让两个线程同时从同一个文件中读取,可能是首先要做的事情,但请跟我一起去...)

显然,这不能是单个STM交易; 中间是I/O. 显然,将它作为两个未连接的交易也是错误的.(两个线程可以看到剩下一个字节的配额,并且都决定读取该字节.)

这个问题有一个很好的解决方案吗?或者STM只是这个任务的错误工具?

Gab*_*lez 6

使用TVar Bool命名consistent来跟踪您的IO操作是否正在进行中.在运行的IO操作设置,以一致False和运行IO操作后设置consistentTrue.然后,任何依赖于您正在修改的STM变量的值的操作都会将此子句置于开头:

do b <- readTVar consistent
   check b
   ...
Run Code Online (Sandbox Code Playgroud)

这可确保这些操作只能看到正在修改的变量的一致视图,并且在IO操作正在进行时不会运行.


Pet*_*lák 1

我想说STM做不到,而且是故意的。如果事务回滚,一段STM代码可以在不同的地方重新启动多次。如果您运行事务,它执行 I/O 操作,然后在变量中记录结果时回滚,会发生什么情况?

因此,STM 计算必须是纯粹的,只能添加 STM 基元,例如 STM 可变变量和数组。