线程阻塞整个程序

arm*_*inb 2 c++ multithreading block

我正在尝试制作一个多客户端服务器.我有这个帖子:

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);
}
Run Code Online (Sandbox Code Playgroud)

这个主要程序:

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;
}
Run Code Online (Sandbox Code Playgroud)

当第一个客户端连接时,线程启动,服务器正在等待来自他的消息.但服务器不再等待新客户了.我不知道为什么.是因为do-while线程函数内部存在无限循环吗?如果线程包含无限循环,它们会阻塞整个程序,这有什么意义呢?

Ola*_*che 6

主例程阻塞,因为它等待线程完成: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();.