IT박스

동 기적으로 포트를 읽거나 쓸 때 재귀를 피합니까?

itboxs 2020. 8. 6. 08:05
반응형

동 기적으로 포트를 읽거나 쓸 때 재귀를 피합니까?


Rebol 3의 모든 포트 작업은 비동기 적입니다. 동기식 통신을 수행 할 수있는 유일한 방법은 전화하는 것 wait입니다.

그러나이 경우 대기 호출의 문제는 열려있는 모든 포트에 대한 이벤트를 확인한다는 것입니다 (포트 포트에 대기하지 않은 경우에도). 그런 다음 응답 이벤트 핸들러를 호출하지만 해당 이벤트 핸들러 중 하나에서 읽기 / 쓰기를 수행 할 수 있습니다. 그 결과 "대기"에 대한 재귀 호출이 발생할 수 있습니다.

이 문제를 어떻게 해결합니까?


비동기 항목에서 모든 메시지를 수신하고 FIFO (선입 선출)로 처리하는 일종의 "버퍼"기능을 작성하지 않는 이유는 무엇입니까?

이렇게하면 포트의 비동기 특성을 유지하고 동기화 모드에서 처리 할 수 ​​있습니다.


비동기 이벤트 만 있고 동기 응답이 필요한 경우 처리기 또는 필요한 목표가 충족되면 타이머를 시작하거나 시간 초과 대기 상태가되는 경우 true를 말하고 그렇지 않으면 false를 지정하고 이벤트가 취소 / 재설정되도록하십시오. 중요하다면 동일합니다.


나는 두 가지 디자인 문제가 있다고 생각합니다 (현재 도구 / 솔루션에 내재되어있을 수 있습니다).

  1. Wait너무 많은 일을하고 있습니다 it will check events for all open ports. 사운드 환경에서 대기는 필요한 경우에만 구현해야합니다. 장치, 포트, 소켓 당 ... 공유 리소스간에 불필요한 상호 종속성을 만드는 것은 잘 끝날 수 없습니다. 특히 공유 리소스를 알고 있으면 (인터페이스가 없어도) 많은 문제를 일으킬 수 있습니다.

  2. 이벤트 처리기 가 너무 많은 작업을 수행 수 있습니다. 이벤트 핸들러는 가능한 한 짧아야하며 이벤트 만 처리해야합니다. is가 더 많은 경우 처리기는 너무 많은 작업을 수행합니다 (특히 다른 공유 자원이 관련된 경우). 많은 상황에서 핸들러는 데이터를 저장합니다. 그렇지 않으면 손실 될 것입니다. 비동기 작업은 더 복잡한 작업을 수행합니다.


그냥 자물쇠를 사용할 수 있습니다. Cummunication1은 전역 잠금 상태를 변수로 설정할 수 있습니다 (예 : 스레드 안전). locked = true. 그러면 Communication2가 잠금 해제 될 때까지 기다릴 수 있습니다.

loop do
    sleep 10ms
    break if not locked
end
locked = true
handle_communication()

참고 URL : https://stackoverflow.com/questions/19956665/avoiding-recursion-when-reading-writing-a-port-synchronously

반응형