我正在为一项作业编写报告,其中我使用 STM 包实现了并发多核分支定界算法,并且遇到了一个问题。
使用 STM 的实现显然在 IO monad 中,因为它同时使用 STM 的“原子”和并发的“forkIO”,但它是确定性的。尽管使用了共享内存变量,对于相同的输入,函数的最终结果总是相同的。
我的问题是,在退出 IO 时,除了“unsafePerformIO”之外,我还有哪些选择?我是否应该尝试将其从 IO monad 中取出,因为使用多个内核可能会影响其他没有相同确定性保证的并发代码。
我听说过 Par monad 包(虽然没有使用过),但是 IO monad 中存在 STM,为了获得线程安全的全局变量,我唯一可以替代 STM 的方法是 MVars(我知道),它也存在于 IO monad 中。