【问题标题】:boost::thread producer consumerboost::thread 生产者 消费者
【发布时间】:2012-07-27 08:11:35
【问题描述】:

我是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 的所有权?

【问题讨论】:

    标签: c++ boost boost-thread producer-consumer


    【解决方案1】:

    这样好吗?

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

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

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

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

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

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

    【讨论】:

    • 如果我在调用rawMatrix() 之前解锁互斥锁,我是否还需要锁定rawMatrix() 中的互斥锁?
    • 当然,rawMatrix() 内部的互斥锁是为了保护 _queue 和 _count 免受其他线程看到它们处于不一致状态。
    猜你喜欢
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多