2012-09-11 1 views
2

차단 대기열을 구현하려고합니다. 주요 부분은부스트 스레드 비활성화

template <typename T> 
class Blocking_queue 
{ 
public: 
    std::queue<T> _queue; 
    boost::mutex _mutex; 
    boost::condition_variable _cvar; 

    void Put(T& object); 
    T Get(); 
    void Disable() 
}; 


template<typename T> 
void Blocking_queue::Put(T& object) 
{ 
    boost::mutex::scoped_lock lock(_mutex); 
    _queue.push(T); 
    lock.unlock(); 
    _cvar.notify_one(); 
} 

template<typename T> 
T Blocking_queue::Get() 
{ 
    boost::mutex::scoped_lock lock(_mutex); 

    while(_queue.empty()) 
    { 
     _cvar.wait(_mutex); 
    } 

    T last_el = _queue.front(); 
    _queue.pop(); 
    return last_el; 
} 

template<typename T> 
void Blocking_queue::Disable() 
{ 

} 

(이 교육 작업의 일종) 다음과 같습니다 그리고 난 (작업에서 작성된) 비활성화() 모든 대기 스레드를 "해제"기능을 구현해야합니다. 문제는이 용어의 "배포"가 무엇을 의미하는지, 그리고 어떤 방법을 적용해야하는지 완전히 이해하지 못한다는 것입니다. 그래서 내 생각은 - 다음과 같다 : 사용 안 함()가 호출 될 때 우리는

while(_queue.empty()) 
    { 
     //here 
     _cvar.wait(_mutex); 
    } 

하는 현재의 thread를 발표 할 예정이다, 바로 내가 오전 (루프 내부에)이 자리에 현재의 thread에 대한 몇 가지 방법을 호출해야? 감사.

+1

조건 변수에 대해 읽으십시오. –

+1

큐가 "비활성화"되어 있고 비어 있다면'Get '해야합니까? –

+0

큐가 사용 불가능한 경우 null을 리턴해야합니다. –

답변

1

"대기중인 모든 스레드 해제"는 거의 유용하지 않은 작업입니다. 이 작업으로 무엇을하고 싶습니까?

유용한 것은 대기열을 종료하는 것이므로 대기열에서 대기중인 모든 스레드가 차단 해제되고 Get()을 호출 할 모든 스레드가 즉시 반환됩니다. 이러한 동작을 구현하려면 큐에 종료 플래그를 추가하고 "빈 또는 종료되지"대기 :

template<typename T> 
void Blocking_queue::Disable() 
{ 
    boost::mutex::scoped_lock lock(_mutex); 
    _shutdown = true; 

    _cvar.notify_all() 
} 

를 가져 오기()의 호출로, 데이터가 없음을 나타 내기 위해, 당신은 반환 할 수 추가 bool과 쌍을 만들거나 특별한 예외를 throw합니다. null을 반환하는 방법은 없습니다. 모든 유형 T가 null 값을 가지지는 않습니다.

template<typename T> 
std::pair< bool, T > Blocking_queue::Get() 
{ 
    boost::mutex::scoped_lock lock(_mutex); 

    while (_queue.empty() && !_shutdown) 
     _cvar.wait(_mutex); 

    if (_shutdown) 
     return std::make_pair(false, T()); 

    T last_el = _queue.front(); 
    _queue.pop(); 
    return std::make_pair(true, last_el); 
}