2010-12-16 3 views
9

내 C++ 프로젝트에서 스레드를 지원하기 위해 boost :: thread 라이브러리 (V1.44)를 사용하고 있습니다.무제한으로 boost :: thread 일시 중지

사용자는 자신의 스레드에서 실행중인 테스트 루프의 실행을 무제한 시간 ( ) 동안 일시 중지 할 수 있어야하며 만족할 때마다 다시 시작할 수 있어야합니다.

에서 윈도우 나는 무제한 중단에 대한 정확한 값을 알고 좋은 것, 비록 아무 문제없이이 작품이

bool ContintueLoop(){ 
if(testLoopPaused){ //testLoopPaused can be set by the user via GUI elements 
    try{ 
     boost::this_thread::interruptible_wait(2147483648); //that's very ugly, 
     // somebody knows the right way to pause it for a unlimited time? 
     return true; 
    } 
    catch(boost::thread_interrupted& e){ //when the user selects resume the 
     // the thread is interrupted and continues from here 
     testLoopPaused = false; 
     return true; 
    } 
if(...) //test for other flags like endTestLoop etc. 
    .... 
} 

처럼 해결했다.

나는 내 프로그램의 리눅스 버전을 구현하기 시작했다,하지만 난 컴파일러 오류를

error: interruptible_wait is not a member of boost::this_thread

질문 얻을 문제 에 달렸다 : 후원을 일시 정지 할 수있는 좋은 방법이 무엇 :: 스레드 (사용자가이를 재개하기로 결정 때까지) 시간 제한없이

, 당신에게 내가 부스트 : 스레드를 사용하여 임의의 지점에서 스레드를 일시 정지 할 수있는 방법을 알고 아니에요

+0

'Suspend()'와 같은 명령이 없습니까? –

+0

@sad_man, 아니요. 정의 된 시간 동안 스레드를 일시 중단 할 수면 기능이 있지만 일시 중단 된 스레드는 임의의 시간에 재개 될 수 있다고 생각하지 않습니다. – zitroneneis

답변

18

대단히 감사합니다 그러나 설명 된 상황은 부울, 뮤텍스 및 조건 변수를 사용하여 구현할 수 있습니다.

bool m_pause; // initialise to false in constructor! 
boost::mutex m_pause_mutex; 
boost::condition_variable m_pause_changed; 

void block_while_paused() 
{ 
    boost::unique_lock<boost::mutex> lock(m_pause_mutex); 
    while(m_pause) 
    { 
     m_pause_changed.wait(lock); 
    } 
} 

void set_paused(bool new_value) 
{ 
    { 
     boost::unique_lock<boost::mutex> lock(m_pause_mutex); 
     m_pause = new_value; 
    } 

    m_pause_changed.notify_all(); 
} 

그래서, 당신의 작업자 스레드에서 주기적 m_pause가 false로 설정 될 때까지 반환하지 것이다 block_while_paused()를 호출 할 수 있습니다. 주 스레드에서 set_paused(value)이라고 호출하면 일시 중지 변수의 값을 스레드로부터 안전하게 업데이트 할 수 있습니다.

면책 조항 : 이것은 우리가 여기 몇 가지 유사한 코드에서 적응,하지만 난 말할 것도없고, 적응 코드를 컴파일 실제로 작동 :) 확인하기 위해 시도하지 않은

+0

@Adam 매우 유망한 것으로 보입니다. 나는 그것을 구현하고 다시보고하기 위해 노력할 것입니다, 고마워요! – zitroneneis

+0

작업자 스레드를 나타내는 일종의 클래스가 있다면 가장 좋은 방법은 클래스의 모든 것을 배치하여'set_paused' 이외의 모든 것을 비공개로 만들어서 오용 할 수 없도록하는 것입니다. 주의 할 점은'mutex'와'condition_variable'을 복사 할 수 없다는 점입니다 (부스트로 스레드를 만드는 방법에 따라 약간의 불편 함이 있습니다). –

+0

이제 대기열에 넣고 스레드를 완전히 제어 할 수 있습니다.) @ Adam : 작은 메모, notify_all()을 잠금 해제 할 필요가 없으므로 코드가 간소화됩니다. – stefaanv

1

사람은 여전히 ​​언급 한 기능 (수면 스레드를 필요로하는 경우 이벤트가 발생할 때까지) 부스트 라이브러리를 사용하는 것이 편안하다면, Boost.Interprocess 라이브러리는 질문에서 설명한대로 사용할 수있는 세마포어 메커니즘을 제공합니다.