day*_*ily 3 multithreading haskell thread-safety
的内部实现Data.Unique 用作IORef存储下一个唯一整数的计数器。
据我所知,IORefs 并不完全是线程安全的。特别是,在这种情况下,我们需要自动取出数据并为其加一。如果它不是原子的,我们最终可能会在更新计数器之前读取两个相同的数字。
我知道newUniqueuse的实现只有在整个程序中使用时才atomicModifyIORef被认为是原子的。IORef
因此,我可以推断,如果我在程序中Unique不使用任何 s,那将是线程安全的。IORef问题是:当我使用另一个时会发生什么IORef?行为如何会出现问题?或者只有当我尝试atomicModifyIORef在其他IORef设备上使用时才会出现问题?
ama*_*loy 11
您链接的atomicModifyIORef文档如下:
此函数对于在多线程程序中安全地使用 IORef 非常有用。如果只有一个 IORef,那么使用atomicModifyIORef 访问和修改它可以防止竞争条件。
将原子性扩展到多个 IORef 是有问题的,因此建议如果您需要做更复杂的事情,那么使用 MVar 是一个好主意。
这并不是说如果您的程序包含多个 IORef 就会不安全。这意味着您无法在多个 IORef 上运行单个原子事务。由于 Data.Unique 一次只关心一个 IORef,而从不关心多个 IORef 之间的关系,因此将 Data.Unique 与其他 IORef 结合使用时不会出现竞争条件。