免责声明:使用MVar ()
作为简单的互斥锁可以轻松完成此操作。我只是好奇,看看是否可以使用STM完成。
我想自动执行以下操作:
具体来说,假设我想跟踪已读取的输入字节数,并假装在消耗了一定数量的字节后达到了EOF。 (好的,首先让两个线程同时从同一个文件中读取可能是一件虚假的事情,但是在这方面与我同行……)
显然,这不能是单个STM事务。中间有I/O。显然,将其作为两个未关联的事务也将是错误的。 (两个线程可以看到还剩一个字节的配额,并且两个都决定读取该字节。)
有解决这个问题的好方法吗?还是STM仅仅是执行此任务的错误工具?
最佳答案
我会说STM无法做到这一点,这是有目的的。如果事务回滚,一条STM代码可以在不同位置多次重新启动。如果运行事务,它执行I/O操作,然后在将结果记录到变量中时回滚,将会发生什么?
因此,STM计算必须是纯净的,只能添加STM原语(例如STM可变变量和数组)。
关于haskell - 可以用STM完成吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17502107/