我是boost::thread
的新手我正在使用顯示器製造消費者。這是我迄今爲止的編碼。boost ::線程生產者消費者
//{ 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()'內部的互斥鎖? – 2012-08-01 16:10:52
當然,rawMatrix()裏面的互斥體是爲了保護_queue和_count,以防其他線程在不一致的狀態下看到它們。 – 2012-08-01 16:37:10