2009-10-20 2 views
1

데이터 소스가 주어진 시간 내에 액세스되었는지 확인하고 그렇지 않은 경우 연결을 지우는 간단한 폴링 스레드 (Boost 1.39.0 사용)가 있습니다. 관련 코드는 아래에서 검토 할 수 있습니다.순수 폴링 구현에서 부스트 인터럽트

내 관심은 두 가지이다 :

1) 안전하게 스레드를 폐쇄하는 것이 적절 수면에 인터럽트를 사용? 인터럽트가 잠자기가 끝날 때까지 기다릴 것인가, 아니면 즉시 중단 할 것인가? while 루프를 벗어나기 위해 thread_interrupted 예외를 잡는 것을 볼 수 있습니다.

2) 대부분의 시간을 낭비하는 쓰레기를 낭비하고 있습니까? 표준 C++에서 간단한 폴링 메커니즘을 구현하는 더 좋은 패턴이 있습니까?

boost::xtime xt; 

while (1) { 
    try { 
     boost::xtime_get(&xt, boost::TIME_UTC); 
     xt.sec += _sleep_secs; 
     boost::thread::sleep(xt); 
     // 
     // logic to check resource access 
     // etc. 
    } 
    catch(boost::thread_interrupted const&) { 
     return; 
    } 
} 

답변

2

1) 부스트 : : 스레드의 부스트 구현에서 안전 심사 : 인터럽트() POSIX 스레드를위한해야합니다 : 그들은 뮤텍스를 잠금

void thread::interrupt() 
{ 
    detail::thread_data_ptr const local_thread_info=get_thread_info(); 
    if(local_thread_info) 
    { 
     lock_guard<mutex> lk(local_thread_info->data_mutex); 
     local_thread_info->interrupt_requested=true; 
     if(local_thread_info->current_cond) 
     { 
      BOOST_VERIFY(!pthread_cond_broadcast(local_thread_info->current_cond)); 
     } 
    } 
} 

는 A의 진실하고 방송 interrupt_requested 세트 조건부 변수. 스레드가 boost :: thread :: sleep()에서 잠자면 스레드가 즉시 깨어납니다. 그리고 스레드를 취소하기 위해 pthread_cancel을 사용하지 않습니다.

2) Windows, Linux 또는 HP-UX와 같은 운영 체제에 대해 이야기 할 때 하나의 스레드가 리소스 낭비라고 생각하지 않습니다. 이이 점을 지원하는 견적입니다 :

많은 운영 체제의도 문제가 몇 백 스레드 이상을 처리 할 수 ​​있습니다. 각 스레드는 메가 바이트 스택 (안 드문 기본 값)을 취득하는 경우, 1GB의 사용자 -와 32 비트 컴퓨터 (2^2분의 30^21) = 512 스레드 에서 메모리가상 부족 액세스 가능한 VM (예 : x86에서 일반적으로 제공되는 Linux )

.

+0

감사에서, 나는 그것을 내 dev environemnt를 실행 봤는데이 예상대로 작동하는 것 같다. 그래도 스레딩을 제대로 이해하려면 시간을 할애해야합니다. – Michael

0

나는 사용이 완벽하게 괜찮다고 생각한다. 많은 사람들이 쓰레드를 닫아야 할 때 - 종료 순서를 생각하면 인터럽트를 멈출 수있다.)

부스트에 관해서는 설명서를 읽어야합니다. 특히, 지침 중 일부만 "중단 지점"이므로 스레드가 중단되고 해당 명령이 실행되는 동안 중단되는 경우에만 해당 예외가 발생한다는 것을 의미합니다 . 스레드가 다른 작업을 수행하고 있다면 인터럽트 지점을 입력 할 때만 인터럽트를 얻습니다. 스레드에서 수행중인 작업에 따라 interrupt을 요청한 후 잠시 동안 인터럽트 지점을 입력 할 수 있습니다.

스레드가 활성화 중단과 미리 정의 된 중단 점의 하나 입력하거나, 현재의 경우 다음 번에 중단됩니다

는 나는 내가 다음과 같은 해석 방법, 즉 어떤 경우에 사실 생각 인터럽트가 활성화 된 사전 정의 된 인터럽트 지점 중 하나에 대한 호출에서 차단됩니다.

the boost thread documentation

+0

도움 주셔서 감사합니다. 스레딩 문서를 향상시키는 데 좋은 조언을 얻으려면 위대한 사람이 스레드 프로그래밍을 많이하는 데 익숙하지 않은 사람을 소화하기가 상당히 어려울 수 있습니다. – Michael