men*_*ics 6 performance multithreading haskell uniqueidentifier
我有多个线程处理事件.我想为每个事件分配一个纳秒时间戳.但它必须是一个独特的id.因此,在奇怪的情况下,两个事件到达使得它们将被分配相同的时间戳,我希望其中一个增加一纳秒.鉴于实际精度不在纳秒级别,就系统的时间戳性质而言,这是可以的.
在一个帖子中,这是一个微不足道的问题.但是跨越多个线程,它变得更具挑战性.性能是绝对关键的,所以天真地同步典型的id生成器类型的东西的想法似乎会阻止太多.
是否有一些方法可以解决这个问题,只需要很少锁定或不锁定?
您可以使用它atomicModifyIORef来实现原子计数器。对于 GHC,它是使用原子操作而不是锁来实现的。
import Data.IORef
import System.IO.Unsafe
counter :: IO Int
counter = unsafePerformIO $ newIORef 0
getUnique :: IO Int
getUnique = atomicModifyIORef counter $ \x -> let y = x + 1 in (y, y)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
896 次 |
| 最近记录: |