在单个离散步骤中移除Chan或MVar的内容

我正在编写一个离散仿真,其中来自多个线程的请求值在集中式队列中累积。 每经过n毫秒,一位经理就会醒来处理请求。 当管理者醒来时,它应该在一个离散步骤中检索中央队列的所有内容。 在处理这些请求时,任何尝试提交队列的客户端线程都应该被阻塞。 处理完成后,队列重新打开并且管理器重新进入休眠状态。

什么是最好的方法来做到这一点? STM的重试行为并不是我想要的。 如果我使用Chan或MVar,则无法阻止客户端在处理期间排入其他请求。 一种方法是在持有队列的Chan上使用MVar作为互斥体。 还有其他方法可以做到这一点吗?


我必须在预期的争用水平下进行基准测试,以确切知道最佳解决方案,但这是我的猜测。

使用包含[Item]MVar ,无论您的商品类型是什么。 用newMVar []初始化MVar 。 要将元素添加到中央列表中,请使用modifyMVar_ (return . (item :)) ,其中item是要添加到列表中的项目。 在处理阶段的开始处使用takeMVar ,并且putMVar []及其结束。

首先,请注意,这不是一个队列,内部。 如果您想按照添加的顺序处理事件,请在提取后reverse列表。

其次,只要这些是你在MVar上执行的唯一操作,就没有竞争条件。 那是因为MVar被初始化完成了,每一个操作都是“拿MVar的内容,把其他东西放进去。” 在等待后一部分时,操作可能会阻塞,但这不会造成死锁,并且不会有丢失的更新。


虽然MVar [a]没有问题吗? 当没有要读取的项目时,我们希望读者被阻止,但由于MVar实际上包含[],所以这不会发生。

链接地址: http://www.djcxy.com/p/81449.html

上一篇: Removing the contents of a Chan or MVar in a single discrete step

下一篇: Authentication With Imgur API