在单个离散步骤中移除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