none
QueueとConcurrentQueueの関係 RRS feed

  • 質問

  • 今使っているキューを手っ取り早く排他にしようと思って
    Queue<int> _intValue = new Queue<int>()

    ConcurrentQueue<int> _intValue = new ConcurrentQueue<int>()
    に書き換えたところ、
    キューをクリアするメソッドが無く、困っています
    使い終わったキューを
    _intValue.Clear();
    _intValue.TrimExcess();
    としていたのですが、ConcurrentQueueでキューを空にするのはDequeueか、TryDequeueで無くなるまでループさせるしか無いのでしょうか

    Trimが無いと言うことは、メモリの確保、解放を気にしなくてもすむのでいいのですが・・・

    2013年4月18日 7:47

回答

  • Clear したいのなら、ConcurrentQueue は使えないと判断するべきではないでしょうか。

    ループさせたところで、TryDequeue の呼び出しと次の呼び出しの間は他のスレッドでそのキューにアクセスできます。
    あなたがどこを排他にしたいのかわかりませんが、Clear という処理の間を排他したいのであれば、ConcurrentQueue は使えません。
    (対象のクラスがどのように排他を実現しているかを考えれば、1メソッドの呼び出しの間だけ排他されると予想できます)

    結局は、自分で排他するしかないでしょう。

    • 回答の候補に設定 星 睦美 2013年4月22日 1:39
    • 回答としてマーク 星 睦美 2013年4月24日 6:36
    2013年4月18日 14:12
    モデレータ