免责声明:这可以使用MVar ()
简单的互斥锁轻松完成.我只是想知道它是否可以用STM完成.
我想原子地做以下事情:
阅读一些变量.
根据我刚刚阅读的内容决定要执行的I/O.
执行I/O.
将结果记录在变量中.
具体来说,假设我想跟踪我已读取的输入字节数,并假设在消耗了一定数量的字节后达到了EOF.(好吧,让两个线程同时从同一个文件中读取,可能是首先要做的事情,但请跟我一起去...)
显然,这不能是单个STM交易; 中间是I/O. 显然,将它作为两个未连接的交易也是错误的.(两个线程可以看到剩下一个字节的配额,并且都决定读取该字节.)
这个问题有一个很好的解决方案吗?或者STM只是这个任务的错误工具?
使用TVar Bool
命名consistent
来跟踪您的IO操作是否正在进行中.在运行的IO操作设置,以一致False
和运行IO操作后设置consistent
到True
.然后,任何依赖于您正在修改的STM变量的值的操作都会将此子句置于开头:
do b <- readTVar consistent
check b
...
Run Code Online (Sandbox Code Playgroud)
这可确保这些操作只能看到正在修改的变量的一致视图,并且在IO操作正在进行时不会运行.
我想说STM做不到,而且是故意的。如果事务回滚,一段STM代码可以在不同的地方重新启动多次。如果您运行事务,它执行 I/O 操作,然后在变量中记录结果时回滚,会发生什么情况?
因此,STM 计算必须是纯粹的,只能添加 STM 基元,例如 STM 可变变量和数组。
归档时间: |
|
查看次数: |
610 次 |
最近记录: |