동 기적으로 포트를 읽거나 쓸 때 재귀를 피합니까?
Rebol 3의 모든 포트 작업은 비동기 적입니다. 동기식 통신을 수행 할 수있는 유일한 방법은 전화하는 것 wait
입니다.
그러나이 경우 대기 호출의 문제는 열려있는 모든 포트에 대한 이벤트를 확인한다는 것입니다 (포트 포트에 대기하지 않은 경우에도). 그런 다음 응답 이벤트 핸들러를 호출하지만 해당 이벤트 핸들러 중 하나에서 읽기 / 쓰기를 수행 할 수 있습니다. 그 결과 "대기"에 대한 재귀 호출이 발생할 수 있습니다.
이 문제를 어떻게 해결합니까?
비동기 항목에서 모든 메시지를 수신하고 FIFO (선입 선출)로 처리하는 일종의 "버퍼"기능을 작성하지 않는 이유는 무엇입니까?
이렇게하면 포트의 비동기 특성을 유지하고 동기화 모드에서 처리 할 수 있습니다.
비동기 이벤트 만 있고 동기 응답이 필요한 경우 처리기 또는 필요한 목표가 충족되면 타이머를 시작하거나 시간 초과 대기 상태가되는 경우 true를 말하고 그렇지 않으면 false를 지정하고 이벤트가 취소 / 재설정되도록하십시오. 중요하다면 동일합니다.
나는 두 가지 디자인 문제가 있다고 생각합니다 (현재 도구 / 솔루션에 내재되어있을 수 있습니다).
Wait
너무 많은 일을하고 있습니다it will check events for all open ports
. 사운드 환경에서 대기는 필요한 경우에만 구현해야합니다. 장치, 포트, 소켓 당 ... 공유 리소스간에 불필요한 상호 종속성을 만드는 것은 잘 끝날 수 없습니다. 특히 공유 리소스를 알고 있으면 (인터페이스가 없어도) 많은 문제를 일으킬 수 있습니다.이벤트 처리기 가 너무 많은 작업을 수행 할 수 있습니다. 이벤트 핸들러는 가능한 한 짧아야하며 이벤트 만 처리해야합니다. is가 더 많은 경우 처리기는 너무 많은 작업을 수행합니다 (특히 다른 공유 자원이 관련된 경우). 많은 상황에서 핸들러는 데이터를 저장합니다. 그렇지 않으면 손실 될 것입니다. 비동기 작업은 더 복잡한 작업을 수행합니다.
그냥 자물쇠를 사용할 수 있습니다. Cummunication1은 전역 잠금 상태를 변수로 설정할 수 있습니다 (예 : 스레드 안전). locked = true
. 그러면 Communication2가 잠금 해제 될 때까지 기다릴 수 있습니다.
loop do
sleep 10ms
break if not locked
end
locked = true
handle_communication()
'IT박스' 카테고리의 다른 글
pecl 확장을 설치하려고 할 때 mac OS x 10.7.3의 $ PHP_AUTOCONF 오류 (0) | 2020.08.06 |
---|---|
로컬 가상 호스트를 사용하도록 cURL 설정 (0) | 2020.08.06 |
clang으로 더 빠른 코드 완성 (0) | 2020.08.06 |
Malloc vs New – 다른 패딩 (0) | 2020.08.06 |
C ++ 11의 async (launch :: async)로 인해 비싼 스레드 생성을 피하기 위해 스레드 풀이 더 이상 사용되지 않습니까? (0) | 2020.08.06 |