문제

내가 읽기 데이터는 여러 시리얼 포트가 있습니다.현재 사용하는 사용자 정의 신호 처리기(설정하여 sa_handler)을 비교하고 스레드 기반에서 파일 설명자 정보입니다.내가 찾는 방법 개별 스레드의 독특한 신호 처리기,이와 관련하여 나가는 것을 발견을 선택하는 시스템 호출이 사용할 수 있습니다.

지금은 다음과 같은 질문:

  1. 면 내가 사용하는 스레드(Qt)그때 나는 어디를 넣어를 선택하는 시스템 호출하 모니터링 시리얼 포트?
  2. 는 시스템을 선택 호출 스레드에 안전합니까?
  3. 그것은 CPU 집중하기 때문에 많은 일들이 일어나고 내 응용 프로그램에 포함한 GUI 업데이트?

십시오지 않는 마음,당신이 찾아내는 경우 이러한 질문에 어리석다.내가 사용한 메커니즘에 대한 시리얼 통신입니다.

도움이 되었습니까?

해결책

POSIX 사양(선택) 이 찾는 곳 select 정의합니다.나 개인적으로 추천 poll -그것은 더 나은 인터페이스와 처리할 수 있습니다 숫자의 기술자보다는 시스템 정의 제한.

내가 제대로 이해한다면 당신은 깨어 있는 쓰레드 상태를 기반으로 특정 설명.더 좋은 방법이 될 각 스레드가 자신의 설명 및 전화를 선택한다.당신이 볼 선택을 수정하지 않는 시스템 상태,그리고 한 사용할 쓰레드 지역 변수가 될 것이 안전합니다.그러나,당신은 확실히하고 싶을 방지하기 위해서 가까이 설명하는 스레드에 따라 달라집니다.

select/poll 시간 초과 잎은"기다리고"위 커널 측면,즉 실은 일반적으로 잠을 넣어.이는 수면 그것은 사용하지 않는 어떤세한 방법이 포함되어 있습니다.잠/루에 select 호출 시간 제한 없이에 다른 손은 당신에게 높은 CPU 사용량으로 당신은 끊임없이 회전하에서 루프입니다.

이게 도움이 되었으면 좋겠습니다.

편집:또한, select/poll 예기치 않은 결과를 얻을 수 있습 작업하는 경우 설명자에서 여러 스레드입니다.간단한 이유는 첫 번째 스레드가 될 수 있습 깨어나기 때문에 설명자를 위한 준비를 읽지만,두 번째 스레드를 기다릴 다음 "읽을 수 있는"습니다.

만큼 당신 selecting 에서 동일한 설명자에서 여러 스레드에 당신은 없어야 한다는 문제입니다.

다른 팁

시스템 호출입니다. 스레드 안전해야합니다.

나는 전에 이것을하지 않았지만, 그렇지 않은 경우 다소 놀랐습니다. CPU가 얼마나 집중적인지 select() 제 생각에는 주로 기다리고있는 파일 핸들 수에 달려 있습니다. select() 파일 핸들의 숫자 (> 1)가 준비되기를 기다리는 데 주로 사용됩니다.

또한 언급해야합니다 select() 성능의 이유로 파일 핸들을 폴링하는 데 사용해서는 안됩니다. 정상적인 사용법은 다음과 같습니다. 작업이 완료되었으며 다음 일이 진행될 때까지 일정 시간이 경과 할 수 있습니다. 이제 SELECT를 사용하여 프로세스를 중단하고 다른 프로세스를 실행하도록하십시오. select() 일반적으로 활성 프로세스를 중단합니다. 이것이 스레드와 함께 어떻게 작동하는지 잘 모르겠습니다! 전체 프로세스 (및 모든 스레드)가 중단되었다고 생각합니다. 그러나 이것은 문서화 될 수 있습니다. 시스템 스레드 또는 사용자 스레드를 사용하든 (Linux에서) 의존 할 수도 있습니다. 커널은 사용자 스레드를 알지 못하므로 전체 프로세스를 중단합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top