[英]c++ server with multiple threads
我想编写一个简单的 C++ 聊天服务器。 简化:
void clientThread(int sock){
// receives data on socket and sends to all other client's
//sockets which are held in a vector, when received data<0 thread is
// finished and client is removed from a vector
}
主循环:
vector<thread> th;
while(1){
memset(&rcvAddr,0,sizeof(sockaddr_in));
sock=accept(connectSocket,NULL,(socklen_t*)&addrLength);
cout << "client connected from: " << inet_ntoa(rcvAddr.sin_addr)<< endl;
if(sock<0)
continue;
mtx.lock();
clientDescriptors.push_back(sock);
mtx.unlock();
th.pushback(thread(&server::clientThread,this,sock));
}
我对最后一行有问题。 这个向量不断增长,你知道有什么正确的方法来管理它吗? 如何产生这些线程? 是否有任何已实现的数据结构或类似的东西来管理线程? 我读过线程池,但我认为这并不能解决这个问题。
一种(正确的)设计可能是:
伪代码可能是:
main:
launch thread pool
launch the listening thread
block until server is not neaded
listening thread routine:
while true
accept a client socket
build a task out of the client socket
push the task into the connection queue
task
是实际的函数/函数对象/对象,它对套接字做了一些有意义的事情,比如读取它的内容,将结果写入客户端,关闭套接字。
它会继续增长,因为这就是你所做的——你为每个连接创建一个线程。 有时线程会退出,但您永远无法从该向量中删除元素,因为您没有加入线程。
最好的办法是自动从 vector 中加入所有可连接的线程,但令我沮丧的是,posix 完全没有这个功能——你一次只能加入一个线程。 Posix 傲慢地说,如果您认为需要此功能,则可能需要重新考虑您的应用程序设计。 - 我不同意。 无论如何,你可以做的一件事就是使用线程池——它们会帮助你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.