多线程 – Haskell中多线程的高性能唯一时间戳ID

我有多个线程处理事件.我想为每个事件分配一个纳秒时间戳.但它必须是一个独特的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)

转载注明原文:多线程 – Haskell中多线程的高性能唯一时间戳ID - 代码日志