2013-04-10 77 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