0

我需要在 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

现在一切正常,但我想知道在标准库中没有实现这样一个微不足道的事情的原因是什么,以及解决这个问题的首选方法是什么。我意识到这个算法至少有 O(n) 复杂度,但这不可能是原因,对吧?

4

1 回答 1

3

首选方法是在通道中保留一个计数器,并在写入通道时自动递增计数器,并在读取通道时递减计数器。

您的解决方案遍历通道的所有元素,这可能不适用于实际的高并发工作负载。

于 2013-01-26T23:54:07.530 回答