內部實行Data.Unique 用途IORef為計數器存盤下一個唯一的整數。
據我所知,IORefs 并不完全是執行緒安全的。特別是,在這種情況下,我們需要原子地取出資料并添加一個。如果它不是原子的,我們可能會在計數器更新之前讀取兩個相同的數字。
我知道newUniqueuses的實作,只有在整個程式中使用一個時才atomicModifyIORef說它是原子的。IORef
因此,我可以推斷,Unique如果我不在IORef我的程式中使用任何s,那將是執行緒安全的。問題是:當我使用另一個時會發生什么IORef?行為將如何有問題?還是只有當我嘗試atomicModifyIORef在其他IORefs上使用時才會出現問題?
uj5u.com熱心網友回復:
您鏈接的 atomicModifyIORef 檔案如下:
此函式對于在多執行緒程式中以安全的方式使用 IORef 很有用。如果您只有一個 IORef,那么使用 atomicModifyIORef 訪問和修改它可以防止競爭條件。
將原子性擴展到多個 IORef 是有問題的,因此建議如果您需要做任何更復雜的事情,那么使用 MVar 是一個好主意。
這并不是說如果您的程式包含多個 IORef 就會不安全。它是說您不能在多個 IORef 上運行單個原子事務。由于 Data.Unique 一次只關心一個 IORef,而不是多個 IORef 之間的關系,因此將 Data.Unique 與其他 IORef 結合使用不會出現競爭條件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/398720.html
