2014-11-05 2 views
0

다중 스레드 및 신호 핸들러가있는 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 */의 부분을 에 일시 중지/다시 시작할 수 있습니까?

대단히 감사합니다.

답변

1

signal's man page에서 신호는 프로세스 별 속성이라고 언급했습니다. 따라서 다중 스레드 프로그램에서 신호 처리기는 모든 스레드에 대해 동일합니다.

세마포어를 사용하여 사용하려는 신호 방법을 바꿀 수 있습니다. 자세한 내용은 POSIX semaphore man page을 참조하십시오. 참조 용 예제 코드도 있습니다.

+0

@IsQb이 기능을 수행하려면 신호를 사용해야합니까? 앞서 언급했듯이 프로세스에 대한 신호 처리기는 하나만있을 수 있습니다. 따라서 모든 스레드가 동일한 처리기를 호출하면 동기화 할 방법이 없습니다. – SSC

+0

이것은 핸들러를 사용하여 메인 루틴을 일시 정지 할 수 없다는 것을 의미합니다. 스레드 A가 핸들러에서 대기하고 다른 스레드 B가 일시 중지/재개하려고 할 때 A에서 핸들러가 여전히 사용 중이며 요청을 처리 할 수 ​​없기 때문에 B에서 사용), 메인 루틴에서 실행/일시 정지 상태를 잡아야합니다. 그렇다면'load_main'에서'while (1)'줄을 조정할 것입니다. 그러나 이것은'/ * 계산하는 */'이 끝나고 다시 시작될 때만 멈출 수 있다는 것을 의미합니다. 그리고이 부분에서 멈추고 싶습니다. – IsQb

+0

또는 다르게 입력 : 섹션 자체 내에서 아무 것도 변경하지 않고/* 계산할/* 섹션에서 일시 중지/다시 시작하고 싶습니다. 어떻게 처리되는지는 보조입니다 ... – IsQb

관련 문제