2013-04-10 86 views
0

我有一个很奇怪的问题。在服务器类中,如果我评论t1.join()我无法从HandleFunction中的套接字读取任何内容。但如果我取消注释t1.join(),那工作得很好。 但我需要这个监听函数永远运行,并创建一个线程来处理套接字,只要它接受一个。如果我添加连接,肯定会造成一些问题。 我该如何解决它? 由于事先升压线程和插座

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

在你的循环内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对象将走出去的范围和被摧毁这个循环的每次迭代中,这就是为什么你不能从插座时,读t1.join()已被注释掉。

+0

谢谢萨姆。这似乎是这个问题。 – cynric4sure 2013-04-10 17:13:34

+0

还有一个问题。如何将此循环中创建的新Socket插入此循环外的向量中?由于套接字是不可复制的,我不能将它放入向量中。我不能将指针放入向量中,因为对象将被销毁,指针将指向垃圾。 – cynric4sure 2013-04-10 17:15:27

+0

@cynic套接字生命周期的惯用解决方案是使用'std :: shared_ptr '或'boost :: shared_ptr '。 – 2013-04-10 17:19:07