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

Bil*_*ill 2 haskell

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

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

Car*_*arl 5

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

使用MVar包含[Item],无论您的项目类型是什么.初始化MVarwith with newMVar [].要将元素添加到中央列表,请使用modifyMVar_ (return . (item :)),item您要添加到列表的位置.takeMVar在处理过程开始时使用,putMVar []并在结束时使用.

首先,请注意,这不是内部队列.如果要按照添加顺序处理事物,reverse请在提取后按列表处理.

其次,只要这些是您执行的唯一操作MVar,就没有竞争条件.那是因为MVar初始化已经完成,并且每个操作都是"获取内容MVar,将其他内容放入其中".操作可能会在等待后半部分时阻塞,但这不会死锁,并且不会丢失更新.