我可以通过这种方式使用 IORef 作为一种“互斥体”吗?

Pau*_*-AG 2 haskell

我有一个必须以互斥方式执行的操作。在其他语言中,我可以做类似的事情(类似Python的伪代码):

with myLock:
  # here lock is acquired
  do mutual exclusive operation
# here lock is released
Run Code Online (Sandbox Code Playgroud)

当然,我可以在 Haskell 中使用MVar: 拿走它然后把它放回去。但我想这样做IORef

with myLock:
  # here lock is acquired
  do mutual exclusive operation
# here lock is released
Run Code Online (Sandbox Code Playgroud)

它看起来像其他语言中典型的“原子”或“同步”标志。但我不确定它在 Haskell 中的安全性以及如何实现IORef这样的目标。再说一遍,我的想法是用IORef. 真的安全吗(操作真的会互斥)吗?

Dan*_*ner 5

是的,很安全。这正是atomicin的atomicModifyIORef含义。来自精美文档:

以原子方式修改 IORef 的内容。

此函数对于在多线程程序中安全地使用 IORef 非常有用。如果只有一个 IORef,那么使用atomicModifyIORef 访问和修改它可以防止竞争条件。

我相信在释放“互斥体”时您不需要以原子方式写入,即应该writeIORef duringOperation False没问题——相信操作在不运行时正在运行是安全的,只是效率较低。