2012-07-27 3 views
1

Я новичок в 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() в некотором интервале. и я не знаю, что мне нужно писать в потребителе. и кто будет владеть этим Продюсером, Потребителем и Монитором?

ответ

0

Это нормально?

  1. Вы не должны использовать одну переменную для двух различных предикатов. Используйте одну переменную условия для состояния с полной очередью, а одно - для состояния очереди или вы получите отсутствующие обновления.

  2. В вашей функции produ() вы не должны блокировать второй мьютекс, если это не является необходимым. Если это необходимый предикат для вызова rawMatrix(), вы можете по крайней мере освободить мьютекс до вызова депозита(), чтобы не блокировать два мьютекса. Каждый раз, когда вы блокируете более одного мьютекса, вы должны знать о возможных мертвых блокировках. Одним из способов избежать блокировок является блокировка мьютекса всегда в том же порядке (так называемая иерархия блокировок).

как бы я дизайн производитель и потребитель теперь?

Проектирование вашего производителя и потребителя зависит от вас и зависит от ваших требований. Схема производителя/потребителя используется для отграничения производства рабочей нагрузки от фактической обработки. Это буфер для работы.

кто будет владеть этим производителем, потребителем и монитором?

В зависимости от вашего дизайна может иметь смысл, что Провайдер владеет очередью, а очередь принадлежит потребителям.

+0

Если я разблокирую мьютексы перед вызовом 'rawMatrix()' мне все равно не нужно блокировать мьютекс внутри 'rawMatrix()'? –

+0

Несомненно, мьютексы внутри rawMatrix() существуют для защиты _queue и _count против другого потока, видящего их в несогласованном состоянии. –

Смежные вопросы