【发布时间】:2014-10-30 09:34:52
【问题描述】:
我正在做一个简单的服务器应用程序,你可以有多个连接,每个连接都是一个线程。这是我希望它看起来像的示例(它不起作用),有一个线程集合,其中每个线程实例化一个类连接的对象:
class connection{};
class server{
std::vector<std::thread> active_connections;
public:
void listen() {active_connections.push_back(std::thread(connection));}
};
我一直在寻找解决方案,但我能找到的最好的是一些成员函数线程。当我测试它时,解决方案变得非常错误,例如:
class connection{};
class server{
std::vector<std::thread> active_connections;
public:
void new_connection() { ... }
void listen() {
active_connections.push_back(std::thread(&server::new_connection,this)); }
};
消息是:错误:使用已删除的函数‘std::thread::thread(const std::thread&)。 这是否意味着 std::thread 类想要复制服务器类?我不太懂 C++,所以请不要发火,我只是在问。
谢谢!
编辑:
这就是发生这种情况的地方:
void server::do_listen()
{
int addr_size = sizeof(sockaddr_in);
sockaddr_in client_sock;
connection_info cn_info;
while(true)
{
int csock;
if((csock = accept(server_sock, (sockaddr*)&client_sock, (socklen_t*)&addr_size)) != -1)
{
printf("Incomming connection from %s.\n", inet_ntoa(client_sock.sin_addr));
memset(&cn_info,0, sizeof(connection_info));
cn_info.sock_addr = client_sock;
cn_info.sock = csock;
std::thread thr(&server::new_connection, *this, cn_info);
thr.join();
}
}
}
到目前为止。 server::new_connection() 仍然是空的。
【问题讨论】:
-
这意味着有东西试图复制一个不可复制的
thread对象。但是您发布的代码并没有这样做,并且一旦我修复了明显的错误就会编译(active_connections应该是一个变量,而不是一个函数)。请发布一个最小的测试用例来演示您遇到的问题。
标签: c++ multithreading object vector