我需要在STM中存储一些值的缓冲区。编写器线程需要监视缓冲区的大小。我开始使用TChan来实现这个功能,但我发现API没有提供测量通道长度的方法。作为一个顽固的家伙,我自己实施了这件事:
readTChanLength ch = do
empty <- isEmptyTChan ch
if empty
then return 0
else do
value <- readTChan ch
length <- readTChanLength ch
unGetTChan ch value
return $ 1 + length
现在一切正常,但我想知道在标准库中没有实现这样一个微不足道的事情的原因是什么,以及该sorta问题的首选方法是什么。我意识到这个算法至少有一个O(n)复杂度,但它不是原因,对吗?
答案 0 :(得分:3)
首选方法是保持一个计数器与通道,并在写入通道时原子递增计数器,并在读取通道时递减计数器。
您的解决方案遍历通道的所有元素,这可能不适用于实际的高并发工作负载。