2014-09-09 1 views
0

사용자 수준의 스레드 라이브러리를 구현해야합니다. 내 문제는 수면 기능입니다.다른 스레드의 알람 신호를 구분하는 방법은 무엇입니까?

ualarm 함수에 의해 생성 된 SIGALRM 신호를 사용하여 잠든 스레드를 깨우는 중입니다. 여러 스레드가 서로 다른 절전 시간으로 절전 모드로 전환 될 때 어떻게해야합니까? 절전 모드 대기열에서 어떤 스레드를 제거해야합니까? 다른 스레드의 알람 신호를 구분하는 방법 ??

답변

0

신호 처리기는 대상 스레드의 컨텍스트에서 호출됩니다. 따라서 스레드 별 저장소가 예상대로 작동합니다 (Linux 및 Solaris에서 테스트 함). 신호 처리기에서 스레드로 다시 신호 처리기에서 통신 할 수 the unix self-pipe 트릭을 사용

__thread int signal_pipe; // The write end. 

extern "C" void signal_handler(int signo, siginfo_t*, void*) 
{ 
    if(!signal_pipe) // programming error: signal is being delivered to a wrong thread. 
     abort(); 
    unsigned char signo_byte = static_cast<unsigned>(signo); 
    // standard unix self pipe trick 
    write(signal_pipe, &signo_byte, 1); 
} 

각 스레드를 자신의 파이프를 만들고 그 파이프의 쓰기 끝 signal_pipe를 초기화해야 신호 처리기를 사용하여.

관련 문제