1

私はboost::threadモニターを使ってプロデューサーを消費者にするのは初めてです。これが私がこれまでにコーディングした方法です。

//{ Declarations in header
private:
  boost::condition_variable    _condition;
  boost::mutex                 _mutex;
  std::deque<RawMatrix*>       _queue;
  boost::detail::atomic_count  _count;
//}

void MatrixMonitor::deposit(RawMatrix* rawMatrix){
    boost::unique_lock<boost::mutex> lock(_mutex);
    _condition.wait(lock, boost::bind(std::less_equal<int>(), boost::ref(_count), max));
    _queue.push_back(rawMatrix);
    ++_count;
    _condition.notify_one();
}

RawMatrix* MatrixMonitor::withdraw(){
    boost::unique_lock<boost::mutex> lock(_mutex);
    _condition.wait(lock, boost::bind(std::greater_equal<int>(), boost::ref(_count), min));
    RawMatrix* elem = _queue.front();
    _queue.pop_front();
    --_count;
    _condition.notify_one();
    return elem;
}

それは大丈夫ですか ?そして、私が理解できないことの1つは、プロデューサーとコンシューマーを今どのように設計するかということです。これまでにやった

void MatrixProducer::produce(){
    boost::mutex::scoped_lock lock(_mutex);
    RawMatrix* matrix = rawMatrix();
    _monitor->deposit(matrix);
}
RawMatrix* MatrixProducer::rawMatrix(){/*Generates and returns a matrix*/}

しかし、どのように私produce()はある間隔でを実行することができますか/すべきですか?消費者に何を書く必要があるのか​​わかりません。そして、誰がこのプロデューサー、コンシューマー、モニターの所有権を持つのでしょうか?

4

1 に答える 1

0

それは大丈夫ですか ?

  1. 2 つの異なる述語に対して 1 つの条件変数を使用しないでください。キューがいっぱいの状態に 1 つの条件変数を使用し、キューが空の状態に 1 つの条件変数を使用しないと、更新が失われてしまいます。

  2. Produce() 関数では、2 番目のミューテックスをロックする必要がない場合はロックしないでください。rawMatrix() を呼び出す必要がある述語である場合、deposit() を呼び出す前に少なくともミューテックスを解放して、2 つのミューテックスをロックしないようにすることができます。複数のミューテックスをロックするたびに、デッドロックの可能性に注意する必要があります。デッドロックを回避する 1 つの方法は、mutex を常に同じ順序でロックすることです (いわゆるロック階層)。

プロデューサーとコンシューマーを今どのように設計しますか?

プロデューサとコンシューマの設計はあなた次第であり、要件に大きく依存します。プロデューサ/コンシューマ スキーマは、作業負荷の生成を実際の処理から分離するために使用されます。仕事の緩衝材です。

この Producer 、 Consumer 、および Monitor の所有権を持つのは誰ですか?

設計によっては、プロデューサーがキューを所有し、キューがコンシューマーを所有することが理にかなっている場合があります。

于 2012-07-31T09:48:41.007 に答える