2012-07-27 4 views
1

신입생 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()를 실행해야 할 수 있습니다. 나는 소비자에게 무엇을 써야할지 모른다. 누가이 프로듀서, 소비자 및 모니터의 소유권을 갖게됩니까?

답변

0

괜찮습니까?

  1. 당신은 두 가지 조건에 대해 하나 개의 조건 변수를 사용할 수 없습니다. 큐 전체 조건에 하나의 조건 변수를 사용하고 큐 비어 있음 조건에 하나의 조건 변수를 사용하십시오. 그렇지 않으면 누락 된 업데이트로 끝납니다.

  2. produce() 함수에서 두 번째 뮤텍스를 잠그면 안됩니다. rawMatrix()를 호출하는 데 필요한 술어 인 경우 두 개의 뮤텍스를 잠그지 않고 deposit()을 호출하기 전에 적어도 뮤텍스를 릴리스 할 수 있습니다. 하나 이상의 뮤텍스를 잠글 때마다 가능한 데드락을 알아야합니다. 교착 상태를 피하는 한 가지 방법은 뮤텍스를 항상 매우 동일한 순서 (잠금 계층 구조)로 잠그는 것입니다.

어떻게 지금은 생산자와 소비자를 디자인 할 것인가?

제작자와 소비자 설계는 귀하가 결정하며 귀하의 요구 사항에 따라 다릅니다. 제작자/소비자 스키마는 실제 작업에서 작업로드 생성을 분리하는 데 사용됩니다. 그것은 일을위한 버퍼입니다.

누가이 생산자, 소비자 및 모니터의 소유권을 갖습니까?

디자인에 따라 생산자가 대기열을 소유하고 대기열이 소비자를 소유하고 있음을 의미 할 수 있습니다.

+0

'rawMatrix()'를 호출하기 전에 뮤텍스를 잠금 해제해도'rawMatrix()'내부에 뮤텍스를 잠글 필요가 없습니까? –

+0

물론, rawMatrix() 내부의 뮤텍스는 _queue 및 _count를 다른 스레드가 불일치 상태로 보지 않도록 보호합니다. –

관련 문제