IO をアトミックに実行する必要があると思われる次の関数を作成しました (他のすべての人が同じを使用している限りMVar
)。
atomicIO :: MVar () -> IO a -> IO a
atomicIO mvar io =
do
takeMVar mvar
result <- io
putMVar mvar ()
return result
また、私が理解していることから、Haskell IO の一部は遅延IORef
しているため (例: s)、このセクションで実際にアクションを実行する必要はありません。実行する必要があるタスクをリストする「サンク」(正しい言葉ですか?) を返すだけです。
アイデアは、クリティカル セクション (つまり、シングル スレッド部分) は非常に高速であるべきだということです。
しかし、私が s に書き込んでいてIORef
、Haskell に結果の計算をすぐに開始させたいとしましょう。しかし、前に言ったように、ロックを保持しているときにクリティカル セクションでロックされたくありませんMVar
。
だから私はこれを行うことを考えました:
result <- io `par` io
またはこれ
return result `par` result
またはこれ
result `par` return result
しかし、これでうまくいくかどうかはわかりません。これらのいずれかが正しいアプローチですか、それとも別の方法がありますか? (後者の 2 つはIO ()
アクション()
です。並行して評価しても実際には何の効果もないと考えているからです)。