了解带有带参数的成员函数的 std::thread 构造函数调用

问题描述

我正在尝试使用 winSock 编写一个简单的客户端-服务器-应用程序,以更好地了解它是如何工作的。服务器应该能够支持多个客户端,因此每次有新客户端连接到服务器时,都会启动一个新线程来接收客户端消息。

我有一个结构体来存储有关已连接客户端的信息,例如 winSock SOCKET 所以我不必担心调用 winSock 的 closesocket(...) 函数,因为它将在我的 ConnectedClient 的析构函数调用{1}} 结构:

struct ConnectedClient
{
    SOCKET sock;
    bool disconnected;
    
    ConnectedClient(SOCKET&& sock)
        : sock(std::move(sock)),disconnected(false)
    {}
}

在服务器类中,我有一个 std::vector,它保存所有连接的客户端,并添加一个新连接的客户端,我调用我的函数 AddClient在这函数中,我启动了一个运行函数 ClientRcv:

的线程
class Server
{
    std::vector<std::unique_ptr<ConnectedClient>> clients;
    
    void ClientRcv(const std::unique_ptr<ConnectedClient>& c)
    {
        //...
        c->disconnected = true;
    }
    
    void AddClient(SOCKET&& clientSocket)
    {
        std::unique_ptr<ConnectedClient> cc(std::make_unique<ConnectedClient>(std::move(clientSocket)));
        clients.push_back(std::move(cc));
        
        //(1) this works
        std::thread rcvThread([this]() { ClientRcv(clients.back()); });
        
        //(2) this doesn't
        //std::thread rcvThread(&Server::ClientRcv,this,clients.back());
        
        rcvThread.detach();
    }
}

现在我的问题是: 调用std::thread的构造函数时,为什么(1)编译和(2)抛出以下编译器错误

Error   C2664   'std::tuple<void (__cdecl Server::* )(const std::unique_ptr<Server::ConnectedClient,std::default_delete<Server::ConnectedClient>> &),Server *,std::unique_ptr<Server::ConnectedClient,std::default_delete<Server::ConnectedClient>>>::tuple(std::tuple<void (__cdecl Server::* )(const std::unique_ptr<Server::ConnectedClient,std::default_delete<Server::ConnectedClient>>> &&)': cannot convert argument 1 from '_Ty' to 'std::allocator_arg_t'

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)