我試圖製作一個多客戶端服務器。我有這個線程:線程阻塞整個程序
void client_thread(int new_socket)
{
int size;
char inbuffer[BUF];
do
{
cout << "Waiting for messages: " << endl;
size = recv(new_socket, inbuffer, BUF, 0);
} while (true);
}
,這主要過程:
int main()
{
while (true)
{
//waiting for clients
cout << "Waiting for connections..." << endl;
new_socket = accept (create_socket, (struct sockaddr *) &cliaddress, &addrlen);
//new client connected
if (new_socket > 0)
{
//start thread
thread(client_thread, new_socket).join();
}
}
return 0;
}
當第一個客戶端連接,線程開始和服務器正在等待他的消息。但服務器不再等待新客戶。我不知道爲什麼。是否因爲線程函數內的無限循環do-while
?如果他們包含無限循環會阻止整個程序,那麼線程的重點是什麼?
如果我刪除'join()'程序崩潰,一旦客戶端連接以下消息:'終止調用沒有活動異常' – arminb
什麼庫是'thread()'從哪裏來的?這是你寫的一個函數嗎?很難說爲什麼你會得到例外。 'join()'肯定會導致阻塞,並掩蓋了導致崩潰的問題。 –
不,這不是自定義功能。它來自'std :: thread'(C++ 0x)。我也考慮過這樣編譯它:'g ++ -std = C++ 0x main.cpp -lpthread' – arminb