boost::线程生产者消费者

boost::thread producer consumer

本文关键字:消费者 生产者 线程 boost      更新时间:2023-10-16

我是boost::thread的新手,我正在成为一名拥有Monitor的生产者和消费者。到目前为止,我就是这样编码的。

//{ 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()。我不知道我需要在consumer上写些什么。谁将拥有该生产者、消费者和监督员的所有权?

这样可以吗?

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

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

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

设计你的生产者和消费者取决于你,在很大程度上取决于你的需求。生产者/消费者模式用于将工作负载的产生与实际处理解耦。这是工作的缓冲区。

谁将拥有该生产者、消费者和监督员的所有权?

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