gpt4 book ai didi

haskell - 线程在 MVar 操作中无限期阻塞

转载 作者:行者123 更新时间:2023-12-02 16:35:46 25 4
gpt4 key购买 nike

我一直在尝试调试使用多个 MVar 时的问题,但没有成功。

我的代码使用两个 MVar:一个用于存储服务器当前状态,另一个用于在客户端线程之间传递网络事件。然而,在多次连接和断开连接之后,服务器在新客户端连接时停止发送数据(可能是因为网络事件 MVar 出于某种原因被清空),并最终出现错误:*** 异常:线程无限期阻塞MVar 操作

过去几天我在尝试调试此问题时得出以下结论:

  1. 用于修改 MVar 的函数不会抛出异常
  2. 只有在客户端连接或连接后断开连接时才会出现该问题
  3. 该问题似乎是随机发生的(有时多个客户端可以连接然后断开连接,有时会立即发生)

我已将问题隔离到三个文件:

  1. https://github.com/Mattiemus/IMC-Server/blob/master/IMC.hs (sense 中抛出异常)
  2. https://github.com/Mattiemus/IMC-Server/blob/master/IMC/Networking/Server.hs (在 application handleClientcleanupClient 内修改)
  3. https://github.com/Mattiemus/IMC-Server/blob/master/IMC/Utilities/Concurrency.hs (推送和弹出到 MVar 中存储的列表的函数)

我完全没有想法,因为我只使用modifyMVar和withMVar(所以肯定它永远不应该完全留空) - 我唯一的假设是修改MVar时可能会抛出异常,但我认为这是可能性很小。

感谢任何帮助,这个问题已经困扰我一段时间了。

最佳答案

对于任何可能偶然发现这一点的人来说,一些附加信息线程在 MVar 操作中无限期阻塞并不是那么明智。当包含对 MVar 的引用的每个线程都尝试读取(或写入)该位置、已死亡或正在等待永远被阻止的另一个原语时,就会发生这种情况。例如,线程 1 正在尝试读取 MVar a 并等待线程 2,该线程要么已死,也尝试读取 MVar a,或者尝试读取 MVar b 只能在线程 1 中写入。

下面的代码很高兴永远挂起:

do
a <- newEmptyMVar
forkIO (readMVar a >>= print)
putMVar a $ last $ repeat 0

关于haskell - 线程在 MVar 操作中无限期阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30881229/

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