簡體   English   中英

線程阻塞整個程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM