Joe*_*ams 9 haskell thread-safety ioref
如果我IORef在多个线程之间共享,并使用atomicModifyIORef写入它:
atomicModifyIORef ref (\_ -> (new, ()))
Run Code Online (Sandbox Code Playgroud)
用普通的旧版读取价值是否安全readIORef?或者有可能readIORef在atomicModifyIORef修改后在另一个线程中返回旧值吗?
我认为这就是文档所暗示的:
atomicModifyIORef充当重新排序的障碍.多个atomicModifyIORef操作以严格的程序顺序发生.在任何早期(在程序顺序中)IORef操作之前,或在任何后来的IORef操作之后,都不会发现atomicModifyIORef.
我只是想确定一下.
dfl*_*str 14
atomicModifyIORef保证原子读取和下面的原子写入之间没有任何反应,从而使整个操作成为原子.您引用的注释只是声明不会atomicModifyIORef并行发生,并且优化器不会尝试重新排序语句以优化程序(在某些情况下可以安全地移动单独的读取和写入;例如a' <- read a; b' <- read b; write c $ a' + b',读取可以安全地重新排序)
readIORef 已经是原子的,因为它只执行一个操作.
但是,您正在讨论另一个问题.是的,如果atomicModify发生在t=3ms和read发生时t=4ms,您将获得修改后的值.然而; 线程不保证并行运行,所以如果你这样做(伪代码):
forkIO $ do
sleep 100 ms
atomicModify
sleep 1000 ms
read
Run Code Online (Sandbox Code Playgroud)
...不能保证在修改后会发生读取(尽管在现代操作系统上这种情况极不可能),因为操作系统可能会决定以不会发生的方式调度新的短期线程.平行.
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |