我是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()
。而且我不知道我需要在消费者中写些什么。谁将拥有此制作人,消费者和监视器的所有权?
答案 0 :(得分:0)
可以吗?
您不应该为两个不同的谓词使用一个条件变量。对队列满状态使用一个条件变量,对队列空状态使用一个条件变量,否则最终会丢失更新。
在您的produce()函数中,如果不需要,则不应锁定第二个互斥锁。如果它是调用rawMatrix()的必要谓词,那么在调用deposit()之前至少可以释放互斥锁,而不是锁定两个互斥锁。每次锁定多个互斥锁时,都必须注意可能的死锁。避免死锁的一种方法是始终以完全相同的顺序锁定互斥锁(所谓的锁定层次结构)。
我现在如何设计制作人和消费者?
设计您的生产者和消费者取决于您并且在很大程度上取决于您的要求。生产者/消费者模式用于将工作负荷的产生与实际处理分离。它是工作的缓冲区。
谁将拥有此制作人,消费者和监视器的所有权?
根据您的设计,生产者拥有队列并且队列拥有消费者可能是有意义的。