gpt4 book ai didi

haskell - Haskell 中的读写锁

转载 作者:行者123 更新时间:2023-12-04 21:50:42 32 4
gpt4 key购买 nike

我正在实现一个在内存中保存一些数据的网络应用程序。一些请求读取此数据进行处理,一些请求更新此数据。

在这种场景下,多个读者可以并发操作数据,但是一个写者需要独占访问内存中的数据。我想实现一个 reader-writer lock解决这个问题。我还想要锁上的等待者按 FIFO 顺序处理的公平性,以避免读写饥饿。

Haskell 标准库似乎不提供此类功能。我找到了 concurrency-extra提供了此功能,但该库似乎无人维护(并在 LTS 3.22 之后从堆栈中删除)——我不清楚它的公平性属性。

标准的haskell库和stackage中没有读写锁库,我觉得有点奇怪——读写模式不是在很多软件中很常见吗?还是有一种完全不同的(可能是无锁的)方法在 Haskell 中更受欢迎?

编辑:更准确地说,在公平属性上,当写入者被阻塞等待获取锁时,只有在写入者获取并释放写锁后才允许后续的读锁请求 -类似于 MVar 的公平属性 - MVars have a FIFO property

最佳答案

读写锁很容易在 STM 之上实现。

data LockState = Writing | Reading Int
type Lock = TVar LockState

startReading :: Lock -> STM ()
startReading lock = do
s <- readTVar lock
case s of
Writing -> retry
Reading n -> writeTVar (Reading (succ n))


stopReading :: Lock -> STM ()
stopReading lock = do
s <- readTVar lock
case s of
Writing -> error "stopReading: lock in writing state?!"
Reading n -> writeTVar (Reading (pred n))


startWriting :: Lock -> STM ()
startWriting lock = do
s <- readTVar lock
case s of
Reading 0 -> writeTVar Writing
_ -> retry

stopWriting :: Lock -> STM ()
stopWriting lock = do
s <- readTVar lock
case s of
Writing -> writeTVar lock (Reading 0)
_ -> error "stopwriting: lock in non-writing state?!"

我对上述内容的主要担忧是 1) 对我来说它看起来有点矫枉过正,以及 2) 我们仍然无法保证 STM 中的公平性( active )。

我想人们可以在 MVar 之上实现一个类似的库,尽管那样会更复杂,尤其是如果我们想保证公平的话。

我很想避免使用 MVar 并改用信号量,而是使用 QSem,这保证了 FIFO 语义。使用这些,可以实现 Dijkstra 风格的读取器/写入器。

关于haskell - Haskell 中的读写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37318611/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com