0

STM にいくつかの値のバッファを保存する必要があります。書き込みスレッドは、バッファーのサイズを監視する必要があります。私はTChannelを使用してこのことを実装し始めましたが、API がチャネルの長さを測定する方法を提供していないことがわかりました。1 つの頑固な男であるため、私はそれを自分で実装しました。

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 に答える