Я новичок в boost::thread
Я делаю потребитель-производитель с монитором. Вот как я его закодировал до сих пор.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()
в некотором интервале. и я не знаю, что мне нужно писать в потребителе. и кто будет владеть этим Продюсером, Потребителем и Монитором?
Если я разблокирую мьютексы перед вызовом 'rawMatrix()' мне все равно не нужно блокировать мьютекс внутри 'rawMatrix()'? –
Несомненно, мьютексы внутри rawMatrix() существуют для защиты _queue и _count против другого потока, видящего их в несогласованном состоянии. –