2013-04-10 2 views
0

매우 이상한 문제가 있습니다. 서버 클래스에서 t1.join()에 주석을 달면 HandleFunction의 소켓에서 아무것도 읽을 수 없습니다. 하지만 t1.join() 주석을 제거하면 잘 작동합니다. 하지만이 수신 기능을 영원히 실행하고 받아 들일 때마다 소켓을 처리 할 스레드를 만들어야합니다. 내가 거기에 합류하면 몇 가지 문제가 생길 것입니다. 어떻게 해결할 수 있습니까? 이 때 소켓에서 읽을 수없는 이유 void listen()부스트 스레드 및 소켓

for(;;) 
    { 
    boost::asio::ip::tcp::socket socket(io_service); 
    socketPtr = &socket; 
    acceptor.accept(socket); 
    HandleClass objHandleClass; 
    boost::thread t1(boost::bind(&HandleClass::HandleFunction, &objHandleClass, boost::ref(socketptr))); 
    //t1.join(); 
    } 

귀하의 socket 객체 내부 루프에서 미리

class server 
{ 
    io_service; 
    acceptor; 
    void listen() 
    { 
    for(;;) 
    { 
    boost::asio::ip::tcp::socket socket(io_service); 
    socketPtr = &socket; 
    acceptor.accept(socket); 
    HandleClass objHandleClass; 
    boost::thread t1(boost::bind(&HandleClass::HandleFunction, &objHandleClass, boost::ref(socketptr))); 
    //t1.join(); 
    } 
    } 
} 

int main() 
{ 
    server objServer; 
    objServer.listen(); 
} 

class HandleClass 
{ 
    HandleFunction(socket* socketPtr) 
    { 
    //read from this socket; 
    } 
} 

답변

1

에서 감사 범위를 벗어나 이동하고이 루프의 각 반복을 파괴,이다 t1.join()은 주석 처리되었습니다.

+0

샘 감사합니다. 이 문제가있는 것 같습니다. – cynric4sure

+0

질문이 하나 더 있습니다. 이 루프에서 생성 된 새 소켓을이 루프 외부의 벡터에 넣으려면 어떻게해야합니까? 소켓은 복사 할 수 없으므로 벡터에 넣을 수 없습니다. 그리고 나는 객체가 파괴 될 것이고 포인터가 쓰레기를 가리킬 것이기 때문에 포인터를 벡터에 놓을 수 없다. – cynric4sure

+0

@cynic 소켓 수명의 관용적 솔루션은'std :: shared_ptr '또는'boost :: shared_ptr '. –