일부 작업 (UI 루프 등)을 수행하는 기본 스레드가있는 응용 프로그램에서 작업하고 있지만, 다운로드 할 수있는 업데이트가 있는지 주기적으로 테스트합니다. 또한 주 스레드가 보조 스레드에 업데이트 검사를 강제로 요청하고 보조 스레드가 주 스레드에 업데이트 다운로드 확인을 요청할 수있는 가능성을 원합니다.멀티 스레딩을 사용하여 소프트웨어의 업데이트를 정기적으로 확인하고 강제로 업데이트를 확인합니다.
실생활에서 IPC와 멀티 스레딩에 대한 많은 경험이 없으므로 어떻게 설계해야하는지 잘 모르겠습니다. 필자는 결국이 작업을 Windows와 POSIX 모두에서하고 싶습니다. 그러나 지금은 POSIX에 집중하겠습니다. 여기 내 생각은 지금까지의 :
보조 스레드의 의사 :
repeat forever:
check_for_updates()
if (are_any_updates()) {
put the list of available updates on some message queue
send signal SIGUSER1 to main thread
wait for response from that message queue
if (response is positive) download_updates()
}
unblock signal SIGUSER1 on secondary thread
Sleep(one hour)
block signal SIGUSER1
if (any_signal_was_received_while_sleeping)
any_signal_was_received_while_sleeping := false
Sleep(one more hour)
보조 스레드에
SIGUSER1 핸들러 (주 스레드가 업데이트를 확인하기 위해 우리를 요청했습니다) : 기본적으로
block signal SIGUSER1 (making sure we don't get signal in signal)
any_signal_was_received_while_sleeping := true
check_for_updates()
...
unblock signal SIGUSER1
, 메인 스레드가 사용하는 보조 스레드가 SIGUSER1을 사용하여 주 스레드가 사용 가능한 업데이트의 메시지 큐를 조사하고 다운로드해야하는지 여부를 확인하도록 요청하는 동안 SIGUSER1은 보조 스레드에 업데이트 확인을 강제로 요청합니다.
좋은 디자인인지, 제대로 작동하는지 확실하지 않습니다. 내 문제 중 하나는 SIGUSER1을 주 스레드에서 처리하는 것과 관련이 있습니다. 그 이유는 꽤 큰 응용 프로그램이기 때문에 차단하고 차단 해제 할시기가 언제인지 잘 모르겠습니다 (메시지 루프의 어딘가에 있어야한다고 가정합니다) .
Windows에서 IPC 기능 (신호 대신 RPC 일 수 있음)을 사용해야하는 조언을 비롯하여 모든 의견을 환영합니다. 스레드를 사용하면 메시지 대기열을 완전히 제거 할 수 있지만 대신 프로세스를 사용하는 것이 좋습니다. Windows에서 쓰레드를 사용 하겠지만, 아직 POSIX에 대해서는 잘 모르겠습니다.
나는 세마포어와 시간 대기가 충분하다고 생각했을 것이다. 메인 쓰레드는 세마포어를 업데이트하기를 원할 때마다 세마포어를 게시하고, 세마포어는 세마포어에서 한시간 대기를하는 루프에 앉아있다. 그런 다음 업데이트를 확인하십시오. 메인 쓰레드는 메시지 큐를 서비스한다. 신호보다 덜 휴대 가능하지만 신호에 대해 생각할 필요가 없습니다. –
@SteveJessop : POSIX/SysV 세마포어가 시간 초과를했는지 알지 못했습니다. 감사합니다. 그렇지 않더라도 pthread의 조건 변수 인 '시간 초과 대기'를 계속 사용할 수 있습니다. –