다중 스레드 및 신호 핸들러가있는 C에서 문제가 발생했습니다.스레드를위한 다중 독립적 인 핸들러
주 루틴은 다중로드를 호출합니다. 각로드에는 자체 컨트롤러가 있습니다. 그런 다음 컨트롤러는 일시 중지하고 다른 시간에 해당로드로 재개 할 신호를 보냅니다. 하나의 부하를 사용하는 경우 코드는 작동
static void signal_handler(int signo) {
/* When signal PAUSE received, get into loop until RESUME arrives */
while (signo != SIGNAL_RESUME) {
/* While in the loop, the main routine gets paused */
sigwait(signalsBetweenControllerandLoad, &signo);
}
}
int load_main() {
signal(SIGNAL_PAUSE, signal_handler);
signal(SIGNAL_RESUME, signal_handler);
while(1) {
/*calculating something */
}
}
:
부하의 코드는 다음과 같이 보입니다. 그러나 여러로드가 실행 중일 때 때때로 간섭을 시작합니다. 그렇게하면 프로그램이 실행 중 정지됩니다. 그러나 때로는 코드가 예상대로 완료되는 경우도 있습니다. 로드가 적을수록 프로그램이 예상대로 작동 할 가능성이 높아집니다.
누군가가 왜 작동하지 않는지 말할 수 있습니까? 연구 결과, 프로세스 (및 모든 하위 프로세스)는 한 번에 하나의 신호 처리기 만 활성화 할 수 있다는 것을 알게되었습니다. 사실입니까?
EDIT :이 섹션 ("블랙 박스", 외부 적으로 주어진 기능)을 수정할 수없는 경우 임의의 시간에 /*calculating something */
의 부분을 에 일시 중지/다시 시작할 수 있습니까?
대단히 감사합니다.
@IsQb이 기능을 수행하려면 신호를 사용해야합니까? 앞서 언급했듯이 프로세스에 대한 신호 처리기는 하나만있을 수 있습니다. 따라서 모든 스레드가 동일한 처리기를 호출하면 동기화 할 방법이 없습니다. – SSC
이것은 핸들러를 사용하여 메인 루틴을 일시 정지 할 수 없다는 것을 의미합니다. 스레드 A가 핸들러에서 대기하고 다른 스레드 B가 일시 중지/재개하려고 할 때 A에서 핸들러가 여전히 사용 중이며 요청을 처리 할 수 없기 때문에 B에서 사용), 메인 루틴에서 실행/일시 정지 상태를 잡아야합니다. 그렇다면'load_main'에서'while (1)'줄을 조정할 것입니다. 그러나 이것은'/ * 계산하는 */'이 끝나고 다시 시작될 때만 멈출 수 있다는 것을 의미합니다. 그리고이 부분에서 멈추고 싶습니다. – IsQb
또는 다르게 입력 : 섹션 자체 내에서 아무 것도 변경하지 않고/* 계산할/* 섹션에서 일시 중지/다시 시작하고 싶습니다. 어떻게 처리되는지는 보조입니다 ... – IsQb