신입생 boost::thread
저는 생산자 고객을 모니터로 만들고 있습니다. 이것이 내가 지금까지 코딩 한 방법입니다.boost :: thread producer consumer
//{ 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*/}
한 적이하지만 어떻게/I는 일부 구간에서
produce()
를 실행해야 할 수 있습니다. 나는 소비자에게 무엇을 써야할지 모른다. 누가이 프로듀서, 소비자 및 모니터의 소유권을 갖게됩니까?
'rawMatrix()'를 호출하기 전에 뮤텍스를 잠금 해제해도'rawMatrix()'내부에 뮤텍스를 잠글 필요가 없습니까? –
물론, rawMatrix() 내부의 뮤텍스는 _queue 및 _count를 다른 스레드가 불일치 상태로 보지 않도록 보호합니다. –