作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用由多个线程访问的 TVar
列表。但是,我的代码中有一个性能关键部分,内容如下:
sequence [ atomically $ writeTVar tvar1 someValue | tvar1 <- listOfTVars ]
可以保证,在执行此代码时,没有其他线程会访问 listOfTVars
中的任何个 TVar
> 直到sequence
完成,既不通过读取也不通过写入。
GHC 是否公开了任何允许我“不安全”执行这些值更新的原语? 我的目标是更快地完成此操作,而无需经历为每个人提交事务的 STM 开销。换句话说,我不需要 STM 为 writeTVar 提供的原子性;相反,我只需要一种快速的方法来更新存储在 TVar 中的值。
最佳答案
环顾四周,我没有看到任何暴露的基元。
文档说您可以将 unsafePerformIO
与 atomically
一起使用,但警告说它可能会破坏它提供的一些保证:Control.Monad.STM.atomically 。显然,unsafeDupablePerformIO
的性能比 unsafePerformIO
更好,但有更多警告。如果性能至关重要,则值得进行基准测试,看看它们是否提供任何性能优势。
import Control.Concurrent.STM.TVar
import Control.Monad.STM
import Control.Monad
import System.IO.Unsafe
t1 <- newTVarIO "Hello"
t2 <- newTVarIO "Goodbye"
unsafeDupablePerformIO $ sequence $ (\t -> atomically $ writeTVar t "Hola") <$> [t1,t2]
unsafeDupablePerformIO $ sequence $ (putStrLn <=< readTVarIO) <$> [t1,t2]
关于haskell - writeTVar 的不安全版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58580756/
我正在使用由多个线程访问的 TVar 列表。但是,我的代码中有一个性能关键部分,内容如下: sequence [ atomically $ writeTVar tvar1 someValue | t
我是一名优秀的程序员,十分优秀!