부스트-아시아 네트워크 프로그래밍을 위해 응답 처리를위한 최선의 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/763429

문제

네트워크 프로그래밍, 특히 비동기 프로세스를 처음 접했습니다. Boost-Lib로 새로 시작하십시오

IMAP 서버에 액세스하기 위해 클래스를 구현하고 있습니다. 일반적으로 명령과 응답을 보내고받을 수 있습니다.

응답은 클래스 내부의 Dequeue에서 대기됩니다. 추가 처리를 위해 대기열에 응답 라인을 간단하게 넣었습니다.

대기열 응답을 처리하는 가장 좋은 방법은 무엇입니까?

  1. 새 항목을 위해 큐를 확인할 여분의 스레드?
  2. 새 항목이 큐에 닿을 때마다 콜백을 만들까요?
    이 콜백을 구현하고 통합하려면 어떻게해야합니까?

아마도 누군가가 이것에 대한 짧은 예를 가지고있을 것입니다.

감사

도움이 되었습니까?

해결책

새 항목이 큐에 닿을 때마다 콜백을 만들까요? 이 콜백을 구현하고 통합하려면 어떻게해야합니까?

나는 당신이 단일 스레드 동기 연결로 작업하고 있다고 가정합니다.

그런 일을하십시오 :

class worker {

    deque<message> messages;
    bool is_writing_;

    push_message(message msg) {
        messages.push_back(msg);
        notify();
    }

    void notify()
    {
        if(!is_writing_) {
            is_writing_=true;
            init();
        }
    } 

    void init()
    {
        if(messages.empty()) { is_writing_=false; return; }
        messamge msg=messages.pop();
        convert_to_vector(v);
        async_write(socket,buffer(v),
            boost::bind(&worker::complete,this,placehoders::error));
    }
    void complete(error_code const &e)
    {
        if(!e) {
            init();
        }
        else { cleanup(); }
    }

};

메모!!!

이것은 단일 스레드 구현입니다. 다른 스레드에서 알리는 경우 호출하지 않아야합니다. some_worker->push_message(msg), iosrvice를 사용해야합니다.

service.post(boost::bind(&worker::push_message,some_worker,msg));

그리고 push_message ioservice를 실행하는 것과 동일한 스레드에서 호출됩니다.

다른 팁

큐 프로세서를 구현하는 한 가지 가능한 방법은 신호 세마포어를 사용하는 것입니다.

예를 들어 pthread 조건 유형 (설명) POSIX 호환 플랫폼에있는 경우.

백그라운드에서 "대기열 처리 스레드"의 N 번호가있을 수 있습니다.

  1. 줄에 무언가가 밀릴 때마다 세마포어가 신호를 보냅니다.

    • 신호는 데이터가 있다는 것을 알기 때문에 큐를 처리하기 시작하는 "큐 프로세싱"스레드를 수면으로 수신됩니다.

    • 스레드가 처리를 완료하면 데이터가 처리되면 큐 크기를 확인하여 다른 것을 가져와야하는지 확인하십시오.

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