【发布时间】:2021-09-15 19:50:25
【问题描述】:
我正在制作一个 HTTP 服务器,我想将一个套接字客户端类传递给线程来处理请求。问题是在启动线程后立即调用析构函数,因此套接字被关闭。 简化版的代码如下所示。
while (true) {
TcpSocket client = m_socket.accept();
std::thread clientThread([this, &client] { this->handleClient(client); });
clientThread.detach();
}
我尝试创建一个接受连接并将其传递给具有给定函数的线程的函数,但我无法让它工作。我在这里使用元组是因为你 can't pass a parameter pack to lambda in c++17。
template<typename Function, typename ...Args>
std::thread TcpListener::acceptAndPassToThread(Function&& function, Args&&... args)
{
int socketDescriptor = accept(m_socketDescriptor, nullptr, nullptr);
std::tuple arguments = std::make_tuple(std::forward<Args>(args)...);
std::thread clientThread([socketDescriptor, function, arguments] {
TcpSocket client = TcpSocket(socketDescriptor);
auto callArguments = std::tuple_cat(std::make_tuple(client), arguments);
std::apply(function, callArguments);
});
return clientThread;
}
我可以做这样的事情,但我不想在类之外使用套接字描述符。
while (true)
{
int clientDescriptor = m_socket.acceptDescriptor();
std::thread clientThread([this, clientDescriptor] {
TcpSocket client = TcpSocket::fromDescriptor(clientDescriptor);
this->handleClient(client);
});
clientThread.detach();
}
还有什么是使用类成员函数调用 TcpListener::acceptAndPassToThread 函数的正确方法。
【问题讨论】:
标签: c++ multithreading sockets variadic-templates raii