免责声明:使用MVar ()作为简单的互斥锁可以轻松完成此操作。我只是好奇,看看是否可以使用STM完成。

我想自动执行以下操作:

  • 阅读一些变量。
  • 根据我刚刚阅读的内容确定要执行的I/O。
  • 执行I/O。
  • 将结果记录在变量中。

  • 具体来说,假设我想跟踪已读取的输入字节数,并假装在消耗了一定数量的字节后达到了EOF。 (好的,首先让两个线程同时从同一个文件中读取可能是一件虚假的事情,但是在这方面与我同行……)

    显然,这不能是单个STM事务。中间有I/O。显然,将其作为两个未关联的事务也将是错误的。 (两个线程可以看到还剩一个字节的配额,并且两个都决定读取该字节。)

    有解决这个问题的好方法吗?还是STM仅仅是执行此任务的错误工具?

    最佳答案

    我会说STM无法做到这一点,这是有目的的。如果事务回滚,一条STM代码可以在不同位置多次重新启动。如果运行事务,它执行I/O操作,然后在将结果记录到变量中时回滚,将会发生什么?

    因此,STM计算必须是纯净的,只能添加STM原语(例如STM可变变量和数组)。

    关于haskell - 可以用STM完成吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17502107/

    10-13 05:24