2015-02-07 3 views
3

다음 예제를 고려하십시오. 한 명의 생산자와 N 명의 소비자가 데이터를 기다리고 있다고 가정합니다. 데이터가 준비 될 때마다뿐만 아니라 제작자가 어떤 이유 (오류 또는 중단 지점)로 종료 할 때도 고객에게 알리고 싶습니다. 후자의 경우 독자는 물론 종료해야합니다.스레드 출구에서 대기자에게 알리기

// Globals 
boost::shared_future<void> future; 
boost::condition_variable_any cv; 

// Producer 
auto producer = [&](){ 
    boost::this_thread::at_thread_exit([&cv]() { cv.notify_all(); }); 
    while (true) { 
      boost::this_thread::interruption_point(); // might throw 
      // ... 
      cv.notify_all(); 
    } 
}; 
boost::packaged_task<void> pkg{producer}; 
future = pkg.get_future(); 
thread = boost::thread{std::move(pkg)}; // start 

// Reader 
while (true) { 
     // ... 
     // will the future be ready after the producer has been interrupted? 
     cv.wait(lock_, [&ready, &future]() { return ready || future.is_ready(); }); 
     if (future.is_ready()) { 
      future.get(); // throw, whatever has been thrown by the producer 
      return; 
     } 
     // consume, etc... 
} 

위의 사항이 작동하는 것입니까? 부울 플래그를 도입하는 것을 피하고 싶습니다. 또는 - 더 나은 - 또 다른 새로운 약속/장래의 쌍으로 독자가 제작자가 종료 된 이유를 알리고 독자에게 알릴 수 있습니다.

기본적으로 packaged_task와 연결된 미래가 boost::this_thread::at_thread_exit으로 등록 된 기능에 의해 통지 될 때 준비가되었다고 나는 확신 할 수 없습니다. 이렇게하면 내 경우에 코드를 단순화 할 수 있습니다 (프로듀서 스레드에 새로운 약속을 전달하는 대신). 더 좋은 아이디어가 있다면 알려주세요.

+0

내 테스트에 따르면 ... – Martin

답변

1

예 예. packaged_task과 관련된 미래 준비로 간주 될 수 있다면 독자는 그들이 할 수있는 boost::this_thread::at_thread_exit

에 등록 된 기능을 통지 할 때 특정

에서

는 기본적으로 나는 확실하지 않다. packaged_task은 스레드 기능입니다. thread_proxy implementation from Boost Threadat_thread_exit 후크를 포함하는 tls_destructor을 실행할 때까지 packaged_task은 이미 반환되었으며 약속이 이행되었습니다. -> 공유 된 미래가 준비되었습니다.