boost::线程生产者消费者
boost::thread producer consumer
我是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上写些什么。谁将拥有该生产者、消费者和监督员的所有权?
这样可以吗?
-
对于两个不同的谓词,不应该使用一个条件变量。将一个条件变量用于队列满条件,将一个用于队列空条件,否则将丢失更新。
-
在produce()函数中,如果没有必要,就不应该锁定第二个互斥对象。如果调用rawMatrix()是一个必要的谓词,那么至少可以在调用deposit()之前释放互斥体,以不锁定两个互斥体。每次锁定多个互斥对象时,都必须注意可能存在的死锁。避免死锁的一种方法是始终以相同的顺序锁定互斥对象(所谓的锁层次结构)。
我现在该如何设计生产者和消费者?
设计你的生产者和消费者取决于你,在很大程度上取决于你的需求。生产者/消费者模式用于将工作负载的产生与实际处理解耦。这是工作的缓冲区。
谁将拥有该生产者、消费者和监督员的所有权?
根据您的设计,生产者拥有队列,队列拥有消费者,这可能是有意义的。
相关文章:
- 消费者和生产者问题的双重缓冲
- 如何降低生产者获得锁的可能性,而消费者在使用std::condition_variable时无法获得锁?
- C++ deque 消费者总是从生产者那里得到空队列
- C++多线程生产者-消费者问题
- 生产者和消费者优化
- 特定的生产者-消费者方案
- 为什么condition_variable在等待生产者-消费者的锁定?C++
- 将生产者/消费者与障碍同步
- 单个生产者/多个消费者死锁
- 带有共享缓冲区的两个等待线程(生产者/消费者)
- C++简单的消费者生产者问题
- 生产者/消费者,消费者线程从未执行过
- 在使用 pthread 和信号量实现生产者-消费者问题时需要帮助
- 如何在 c++ 中使用 winapi 事件解决生产者-消费者
- C++生产者消费者陷入僵局
- 简单生产者和消费者的unique_lock困难
- 生产者消费者实现中的条件变量应如何初始化
- 如何实现消费者生产者,消费者可以请求新的数据
- c++中的消费者/生产者
- 如何同步线程(消费者/生产者)