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;
}

可以吗 ?我无法理解的一件事是我现在将如何设计生产者和消费者?到目前为止我已经完成了

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

但是我如何/应该produce()在某个时间间隔内运行。而且我不知道我需要在消费者中写什么。谁将拥有此 Producer、Consumer 和 Monitor 的所有权?

4

1 回答 1

0

可以吗 ?

  1. 您不应将一个条件变量用于两个不同的谓词。对队列满条件使用一个条件变量,对队列空条件使用一个条件变量,否则您最终会丢失更新。

  2. 在您的 producer() 函数中,如果没有必要,您不应该锁定第二个互斥锁。如果调用 rawMatrix() 是必要的谓词,您至少可以在调用 deposit() 之前释放互斥锁,以免锁定两个互斥锁。每次锁定多个互斥体时,都必须注意可能出现的死锁。避免死锁的一种方法是始终以相同的顺序锁定互斥锁(所谓的锁定层次结构)。

我现在将如何设计生产者和消费者?

设计您的生产者和消费者取决于您,并且很大程度上取决于您的要求。生产者/消费者模式用于将工作负载的产生与实际处理分离。这是工作的缓冲。

谁将拥有此 Producer、Consumer 和 Monitor 的所有权?

根据您的设计,生产者拥有队列而队列拥有消费者可能是有意义的。

于 2012-07-31T09:48:41.007 回答