所以我在C ++ 11中学习std :: thread,我想在socket编程中使用std :: vector。
我已经搜索了std :: thread教程,在我看来很多人都在使用带有容器的std :: thread,比如std :: vector。
我的问题是:
将std :: thread与std :: vector一起使用有什么好处?
我用std :: thread和std :: vector(下面的代码)实现我的C ++套接字服务器,我发现了一个问题:
如果客户端连接到我的服务器,我的服务器将创建一个线程并将其存储在std :: vector中,这将增加std :: vector的大小。如果该客户端再次断开连接并重新连接到我的服务器,它将再次为该连接创建一个线程并增加std :: vector大小。但是,即使完成了线程,元素仍然存在。因此,如果客户端重复连接/断开连接到我的服务器,std :: vector的大小将增加,直到机器内存不足。有没有办法检测线程是否完整(或客户端断开连接)并删除std :: vector的元素?
下面是我的实现:假设所有TCP设置都已完成,套接字侦听部分如下所示:
// things to do after connection established
void do_something(int sockfd)
{
// do something
}
int main()
{
/* ------------
TCP socket setup here ...
------------*/
std::vector <std::thread> MyThreads;
// server waiting for connections
while(1)
{
std::cout << "Listening..." << std::endl;
new_sockfd = accept(socked, (struct sockaddr *)&ClientAddress, &len);
MyThreads.push_back(std::move(std::thread(do_something, new_sockfd)));
}
return 0;
}