haskell - writeTVar 的不安全版本

标签 haskell concurrency

我正在使用由多个线程访问的 TVar 列表。 但是,我的代码中有一个性能关键部分,内容如下:

 sequence [ atomically $ writeTVar tvar1 someValue | tvar1 <- listOfTVars ]

可以保证,在执行此代码时,没有其他线程会访问 listOfTVars 中的任何TVar > 直到sequence完成,既不通过读取也不通过写入。

GHC 是否公开了任何允许我“不安全”执行这些值更新的原语? 我的目标是更快地完成此操作,而无需经历为每个人提交事务的 STM 开销。换句话说,我不需要 STM 为 writeTVar 提供的原子性;相反,我只需要一种快速的方法来更新存储在 TVar 中的值。

最佳答案

环顾四周,我没有看到任何暴露的基元。

文档说您可以将 unsafePerformIOatomically 一起使用,但警告说它可能会破坏它提供的一些保证: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/

相关文章:

java - 在 JavaME : how to optimize it? 中实现阻塞队列

java - Java 并发的困难时期

python - 线程安全与模板标签

java - 匿名内部类可以扩展吗?

haskell - 这个Prime测试功能有什么问题吗?

haskell - 这个haskell代码是如何工作的?

haskell - 延迟 IO + 并行 : converting an image to grayscale

haskell - 使用折叠组合 monad Action

java - "less predictable performance of LinkedBlockingQueue in concurrent applications"是什么意思?

bash - 在 docker-compose 命令中运行 stack build --file-watch 时如何修复 "<stdin>: hGetLine: end of file"