假设我有多个线程正在读取文件,并且我想确保在任何时间点只有一个线程正在读取文件。
实现这一点的一种方法是使用 anmvar :: MVar ()并确保互斥,如下所示:
thread = do
...
_ <- takeMVar mvar
x <- readFile "somefile" -- critical section
putMVar mvar ()
...
-- do something that evaluates x.
Run Code Online (Sandbox Code Playgroud)
以上在严格的语言中应该可以正常工作,但是除非我遗漏了什么,否则我可能会在 Haskell 中遇到这种方法的问题。特别是,由于x仅在线程退出临界区后才进行评估,在我看来,只有在线程执行后才会读取该文件putMVar,这首先违背了使用 MVars 的意义,因为多个线程可能会读取同时存档。
我所描述的问题是否真实,如果是,我该如何解决?
haskell ×1