2011-12-21 2 views
4

Spirit은 논 블로킹 IO 작업을위한 모든 기능을 제공합니까?Boost Spirit과 함께 비 차단 또는 비동기 IO를 사용하는 방법은 무엇입니까?

좀 더 구체적인 예를 들면 다음과 같습니다. Boost 's Spirit 구문 분석 프레임 워크를 사용하여 비 차단 모드로 설정된 네트워크 소켓에서 들어오는 데이터를 구문 분석하고 싶습니다. 데이터를 완전히 사용할 수없는 경우 해당 스레드를 차단 대신 다른 작업을 수행 할 수있게하고 싶습니다.

단순한 대답은 Spirit을 호출하기 전에 모든 데이터를 읽는 것입니다. 그러나 잠재적으로 기가 바이트의 데이터를 소켓에서 수신하고 파싱해야합니다.

구문 분석 중에 논 블로킹 I/O를 지원하기 위해 Spirit은 데이터를 부분적으로 구문 분석하고 사용할 수있는 데이터가 더 이상 없을 때 파싱 상태를 저장할 수있는 능력이 필요합니다. 또한 데이터를 사용할 수있게되면 저장된 구문 분석 상태에서 구문 분석을 다시 시작할 수 있어야합니다. 아니면 이걸 너무 복잡하게 만들었나요?

답변

4

TODO은 간단한 단일 스레드 '이벤트 기반'구문 분석 모델에 대한 예를 게시 할 예정입니다. 이것은 대개 사소한 것이지만 필요한 것일 수 있습니다. 적은 사소한 아무것도 들어

, 다음과 같은 고려 사항/힌트/팁에주의하십시오 : 당신은 어떻게 결과를 소모 될


? 합성 어트리뷰트는 어쨌든 이전에 만들지 않았을 것이고, 즉석에서 의미 론적 액션을 사용하려고 할 것입니까?

역 추적으로 인해 정상적으로 작동하지 않습니다. 주의 사항은 qi :: hold, qi :: locals를주의 깊고 현명하게 사용하여 부작용이있는 의 의미 론적 액션을 되돌릴 수없는 스테이션에서 처리 할 수 ​​있습니다. 즉 :

  • 이이 자연스럽게는 문법의 제한된 (다양한 상황에 맞는 정보를 그 문법이 치료를 위해 자신을 잘 빌려하지 않습니다)에 적용
  • 매우 errorprone이 될 수밖에 없다. 이제

은, 모든 물론,을 강요하지만, 일반적으로 경험이 풍부한 프로그래머가 상류로 수영을 피하기 위해 배운해야 할 수 있습니다.

지금, 당신은 여전히이 작업을 수행하려면 :

당신은 BOOST_SPIRIT_THREADSAFE을 정의하고 libboost_thread에 연결하여 정신 라이브러리는 스레드로부터 안전/재진입을 얻을 수 있어야합니다. 참고 참고 Spirit sets threadsafe (fine grained locking을 사용)에서 사용하는 gobals가 있지만 파서는 사용할 수 없으므로 스레드간에 고유 한 파서/규칙/하위 문법/표현식을 공유 할 수 없습니다. 사실 스레드 세이프 (threadafe safe)이면 자신의 (Phoenix/Fusion) 펑터 만 공유 할 수 있으며 코어 Spirit 라이브러리 외부에서 정의 된 다른 확장은 스레드 안전을 위해 감사해야합니다.

위 관리하는 경우, 내가 가장 좋은 방법은 내가 정의하는 것을 선호 것 스트림 원료/진 문자

  • 사용 부스트 :: 정신 :: istream_iterator (또는,에 보일 것입니다 지금까지 생각 유사한 boost::spirit::istreambuf_iteratorboost::spirit::multi_pass<> 템플릿 클래스 사용)을 사용하여 입력을 소비합니다. 문법에 따라, 메모리 꽤 버퍼링에 사용할 수 있고 성능이
  • 가 자신의 스레드 (또는 논리 스레드, 예를 들면하는 Asio '가닥를'부스트 또는 그 유명한에 파서를 실행 차선 유의 'stackless coprocedures')
  • 실제 처리를 수행하는 다른 논리 스레드에 메시지를 전달하기 위해 위에 표시된 것과 같은 거친 의미 론적 동작을 사용합니다.

좀 더 느슨한 포인터 :

  • 쉽게 '퓨즈'일부 기능이 BOOST_FUSION_ADAPT_FUNCTION과 친구를 사용하여 의미 액션 핸들러의 게으른 평가를 처리 할 수있다; 이렇게하면 의미있는 작업에서 일반적인 C++ 과부하 해결과 같은 간단한 작업을 수행하기 위해 작성해야하는 걸리는 양이 줄어 듭니다. 특히 C++ 0X 및 BOOST_RESULT_OF_USE_DECLTYPE을 사용하지 않는 경우에는
  • 과 같은 의미 작업을 피하기를 원할 것입니다. 효과가 있다면 상속 된 속성과 qi::locals<>을보고 '순수한 기능 fashion'의 규칙을 통해 상태를 조정해야합니다.
+0

감사합니다. 나는 당신의 모범을 보길 고대합니다. 역 추적과 관련된 몇 가지 사항을 강조해 주셔서 감사합니다. 제가 작업하고있는 문법 중 하나는 거기에 많은 기대 포인트를 가지고 있습니다. 그래도 괜찮습니다.하지만 다른 문법에 대해서는 잘 알고 있습니다. – Emanuel

+0

어떻게 결과를 소비할지에 관해서는 아직 그 시점에 도달하지 못했지만 실제로는 자체 질문입니다. 의미 지점 및/또는 속성 호환성 규칙을 심층 분석하여 예상 지점에 도달 한 후에 특성을 "스트리밍"할 수있는 방법이 있는지 확인하려고했습니다. – Emanuel

+0

@Emanuel : erm. 결과를 소비하는 것에 대한 질문은 스트리밍이 의미가 있는지 여부를 정의합니다. 파서 단계를 불필요하게 복잡하게하기 전에이를위한 디자인/모델이 있어야합니다. 정말 고마워요. 간단하게 스트리밍 할 수없는 수많은 작업이 있습니다 (XSLT 변환 또는 단순히 역전 필터 [la] ['tac'] (http://linux.die.net/man/1/tac)을 생각해보십시오. 멀티 스레드 및 메시지 대기열에 열심히 노력하더라도 엔트로피를이기십시오. 많은 수의 잠긴 스레드 또는 긴 대기열을 얻게됩니다.) – sehe

관련 문제