gpt4 book ai didi

haskell - 惰性求值如何与 MVar 相互作用?

转载 作者:行者123 更新时间:2023-12-02 02:21:45 27 4
gpt4 key购买 nike

假设我有多个线程正在从文件中读取,并且我想确保在任何时间点只有一个线程正在从文件中读取。
实现这一点的一种方法是使用 mvar :: MVar ()并确保如下互斥:

thread = do
...
_ <- takeMVar mvar
x <- readFile "somefile" -- critical section
putMVar mvar ()
...
-- do something that evaluates x.
以上在严格的语言中应该可以正常工作,但除非我遗漏了什么,否则我可能会在 Haskell 中遇到这种方法的问题。特别是,由于 x仅在线程退出临界区后进行评估,在我看来,文件只会在线程执行后才被读取 putMVar ,这首先破坏了使用 MVar 的意义,因为多个线程可能同时读取文件。
我描述的问题是真实的吗?如果是,我该如何解决?

最佳答案

是的,这是真的。你可以避开所有 base使用 unsafeInterleaveIO 实现的功能.我没有完整的列表,但至少是 readFile , getContents , hGetContents .不执行惰性 IO 的 IO 操作——例如 hGethGetLine - 没事。
如果您必须使用惰性 IO,则在关键部分内的 IO 操作中全面评估其结果,例如通过结合 rnfevaluate .
关于相关事物的其他一些评论,但这并不是这个问题的直接答案:

  • 惰性和惰性 IO 是真正不同的概念。他们碰巧共享一个名字,因为人类懒于命名。大多数 IO 操作不涉及惰性 IO,也不会遇到此问题。
  • 将未评估的纯计算填充到您的 MVar 中存在一个相关问题。并且不小心在与预期不同的线程上对其进行了评估,但是如果您避免延迟 IO,那么在错误的线程上进行评估仅仅是性能错误而不是实际的语义错误。
  • 关于haskell - 惰性求值如何与 MVar 相互作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63295533/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com