- 신호가 전달되는 스레드를 제어하는 가장 좋은 방법은 무엇입니까?
@ zoli2k가 지적했듯이, 처리하고자하는 모든 신호를 처리 할 단일 스레드 (또는 특정 신호 책임이있는 스레드 세트)를 명시 적으로 지정하는 것은 좋은 기술입니다.
- 신호가 도착했음을 다른 스레드 (실제로 사용 중일 수 있음)에게 알리는 가장 좋은 방법은 무엇입니까? [...]
- 신호가 발생했다는 정보를 다른 스레드로 전달하는 것을 어떻게 안전하게 처리 할 수 있습니까? 이것이 신호 처리기에서 발생해야합니까?
"최고"라고 말하지 않겠습니다.하지만 여기에 권장 사항이 있습니다.
main
모든 스레드가 해당 신호 마스크를 상속하도록 에서 원하는 모든 신호를 차단합니다 . 그런 다음 특수 신호 수신 스레드를 신호 구동 이벤트 루프로 만들어 새로 도착한 신호를 다른 스레드 내 통신으로 전달합니다. 합니다.
이 작업을 수행하는 가장 간단한 방법은 스레드가 사용 루프에서 신호를 수신하는 것입니다 sigwaitinfo
나sigtimedwait
. 그런 다음 스레드는 신호를 어떻게 든 변환합니다. 아마도을 브로드 캐스팅하고 pthread_cond_t
, 더 많은 I / O를 사용하여 다른 스레드를 깨우고, 응용 프로그램 별 스레드 안전 대기열에 명령을 넣습니다.
또는 특수 스레드를 사용하면 신호를 처리 할 준비가 된 경우에만 전달을 위해 마스크를 해제하여 신호 처리기에 신호를 전달할 수 있습니다. (처리기를 통한 신호 전달은 sigwait
패밀리 를 통한 신호 수용보다 오류가 더 발생하기 쉽습니다 .)이 경우 수신자의 신호 처리기는 sig_atomic_t
플래그 설정 , 호출 sigaddset(&signals_i_have_seen_recently, latest_sig)
, write
() 바이트 와 같은 간단한 비동기 신호 안전 작업을 수행합니다. 비 - 블로킹 자기 파이프 등 그리고, 다시 메인 마스크 루프 스레드는 상기 다른 스레드에 신호의 수신을 통신한다.
( 업데이트 @caf는 sigwait
접근 방식이 우수하다는 것을 올바르게 지적합니다 .)