![](/img/trans.png)
[英]My program returns 1 after Sleep() if I change a tcp socket to non blocking in a different thread
[英]Thread is blocking whole program
我正在嘗試制作一個多客戶端服務器。 我有這個帖子:
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()
。
如果您不想阻止,則不要join()
您的client_thread。
此異常可能來自您的匿名線程對象的破壞。 當您離開if()
的范圍時,此范圍內的所有對象都將被銷毀。 從http://en.cppreference.com/w/cpp/thread/thread/~thread可以看出,析構函數調用terminate()
。 為了避免它,你可以調用detach()
。 所以代替thread(client_thread, new_socket).join();
,你必須說thread(client_thread, new_socket).detach();
。
你應該創建一個線程並保持對它的引用,直到你加入它。 在您的代碼中,線程對象在創建后立即被釋放,因此如果不立即調用join,則會出現錯誤。
要正確實現這一點,最好的方法是使用new
將對象分配到堆上,並將指針存儲在某個列表中。 當線程完成后,它可能會從列表中刪除自己(不要忘記“互斥”它),或者你可以讓另一個專用線程這樣做:也許你可以讓你的主線程在退出之前加入所有其他線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.