【发布时间】:2016-06-03 11:12:29
【问题描述】:
我正在使用CSocket 编写多线程服务器。所以,像往常一样,我有监听服务器套接字,并且需要为每个连接的客户端创建接收套接字。为了提供多个客户端处理,我想为每个客户端创建新的std::thread,detach,然后在线程函数中处理这个客户端。
我正在尝试这样做:
int client_handler(CSocket receiver)
{
return 1;
}
CSocket server;
BOOL created = server.Create(12345);
server.Listen();
while(true)
{
CSocket receiver;
if (server.Accept(receiver))
{
std::thread handler(client_handler, receiver);
}
}
...
我在 std::thread 实例化时遇到编译器错误:
error C2664: 'std::tuple<int (__cdecl *)(CSocket),CSocket>::tuple(std::tuple<int (__cdecl *)(CSocket),CSocket> &&)': cannot convert argument 1 from 'int (__cdecl &)(CSocket)' to 'std::allocator_arg_t'
我已阅读 std::thread 文档,但仍然无法理解 - 为什么无法将 СSocket 传递给?
【问题讨论】:
-
MSDN 对
CSocket的复制可构造性出人意料地保持沉默。可能它只是不可复制的构造? -
@SergeyA
CSocket派生自CObject,这确实是不可复制的。最好是Detach,将原始SOCKET传递给线程,然后将Attach传递给那里。 -
@IgorTandetnik,我接受它,它也不能移动?
-
@SergeyA 我没有调查过,但如果是的话我会很惊讶。
-
如果它真的是不可复制的,你也可以用
new声明它并传递一个指向client_handler的指针
标签: c++ multithreading sockets c++11