2009-12-31 6 views
1

저는 C++로 코딩 중이므로 비동기 적으로 이미지 파일을로드하려고합니다. 몇 가지 연구가 끝나면 boost :: asio와 boost :: iostreams를 사용하여 몇 가지 언급을 발견했습니다. 그러나, boost :: asio에 대한 문서와 예제는 대부분 소켓과 관련되어 있으므로별로 도움이되지 않습니다. 여기 boost :: asio 및 boost :: iostreams (또는 다른 무엇입니까?)로 비동기 파일 차단을 비동기 적으로 수행하는 데 도움이 필요합니다.

내가 필요로하는 무슨이다.

  • 로드 비동기 적으로로드 완료시 파일을, 콜백 함수를 실행 (내 경우, 콜백 함수는 V8을 사용하여 자바 스크립트 함수 객체를 실행하는 자바 스크립트 엔진)
  • 콜백 함수는 main 함수와 동일한 스레드 내에서 실행되어야합니다. (v8은 스레드로부터 안전하지 않기 때문에)
  • 리눅스와 윈도우에서 작업해야합니다.

    async_read("test.jpg", &the_callback_function); 
    

    기능은 차단해서는 안되며, 파일로드가 완료되면, 그것은 'the_callback_function'를 실행해야합니다 :

그래서,이 같은 정말 좋은 것 (별도의 구현이 확인됩니다).

편집 : joshperry가 지적했듯이, boost :: asio는 주 스레드로 디스패치하지 못할 수도 있습니다. 그래서, 나는 boost :: asio와 boost : iostreams로 제한 할 필요가 없다고 생각한다. 이 요구 사항을 도울 수있는 모든 C/C++ 라이브러리가 정상적으로 작동해야합니다. 감사!

+0

비동기 읽기가 완료되면 어떻게 메인 스레드로 디스패치 할 것으로 예상합니까? – joshperry

+0

음 ... 잘 모르겠습니다. 나는 코 루틴이 그 일을 할지도 모른다고 생각하고있었습니다. 기본적으로 coroutine + non-blocking io는 이론적으로 작동해야합니다. 그래서 나는 asio가 계산서에 맞지 않을지도 모른다고 생각한다. –

+0

메인 스레드로 돌아가는 것은 어려울 것입니다. 기다리지 않는 스레드에 신호를 보내는 좋은 방법은 없습니다. 메인 스레드가 어떤 작업을하고 있습니까? 모든 파일을 자주 확인하고 파일 읽기가 완료되었는지 확인할 수 있습니까? – Pace

답변

1

좀 더 많은 스캐 폴딩을 사용하여 원하는대로 할 수 있지만 기본 스레드에서 콜백을 실행하려면 주 스레드가 콜백 준비 신호를 기다려야합니다. 여기에 한 가지 방법이 있습니다. 당신의 주 스레드가 이미 어떤 형태의 실행 루프를 가지고 있다고 가정합니다.

  • 백그라운드 스레드가 실행될 콜백의 주 스레드를 알리는 데 사용할 수있는 스레드 안전 알림 대기열을 추가합니다.
  • 기다리는 다른 이벤트 소스와 함께 대기열에서 대기하도록 기본 실행 루프를 수정하십시오 (분명히 주 스레드에서 이벤트 구동 루프가 있다고 가정하고 그렇지 않은 경우 취향에 맞게 조정하십시오.).
  • 계속 asio async_read를 콜백과 함께 사용하면 콜백 만 완료 기능을 직접 실행하지 않고 실행을 위해 기본 스레드에 대기시킵니다.

STL과 동기화 객체 (예 : Boost.Thread에서 제공 한 것과 같은)를 사용하여이 대기열을 이식 할 수 있습니다. 경합없이 높은 처리량으로 확장 할 수있는 또 다른 문제이지만, 그런 종류의 확장이 필요한 것처럼 들리지는 않습니다. 다른 라이브러리가이 모든 작업을 수행하더라도, 이와 같이 직접 작성하는 것은 멀티 스레드 프로그래밍을 수행하는 모든 사람에게 훌륭한 연습입니다. 특히 관련된 하나 이상의 구성 요소가 재진입 프로그램이 아닌 경우 특히 유용합니다.