具有多个线程的 c++ 服务器

Posted

技术标签:

【中文标题】具有多个线程的 c++ 服务器【英文标题】:c++ server with multiple threads 【发布时间】:2015-11-10 15:48:06 【问题描述】:

我想写一个简单的 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));
             

最后一行有问题。这个向量不断增长,你知道任何管理它的正确方法吗?如何产生这些线程?是否有任何实现的数据结构或类似的东西来管理线程?我阅读了有关线程池的信息,但我认为这并不能解决这个问题。

【问题讨论】:

你一次又一次地重复推动相同的功能.. 【参考方案1】:

一个(正确的)设计可能是:

管理连接队列的线程池 一个反复接受Sockets的监听线程

伪代码可能是:

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 是实际的函数/函数对象/对象,它对套接字做一些有意义的事情,比如读取它的内容,将结果写入客户端,关闭套接字。

【讨论】:

问题是为线程分配内存,在c++中我们需要一个变量。在 python 中,我们可以使用 thread.start_new_thread( threadFunction, (arg) )。我们这里没有任何变量,我们可以使用它生成多个线程,c++中没有类似的东西吗? 你完全可以用 std::thread t (threadFunction, args...) 做到这一点,阅读文档【参考方案2】:

它将继续增长,因为这就是您所做的 - 您为每个连接创建一个线程。有时线程会退出,但您永远无法从该向量中删除元素,因为您没有加入线程。

最好的办法是自动加入来自向量的所有可加入线程,但令我沮丧的是,posix 完全没有这个功能 - 你一次只能加入一个线程。 Posix 傲慢地声明 如果您认为您需要此功能,您可能需要重新考虑您的应用程序设计。 - 我不同意。无论如何,您可以做的一件事就是使用线程池——它们会帮助您。

【讨论】:

以上是关于具有多个线程的 c++ 服务器的主要内容,如果未能解决你的问题,请参考以下文章

C++服务器设计:多线程模型设计

C++服务器设计:多线程模型设计

多线程在 C++ 中的 Windows 中将多个客户端连接到单个服务器

如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?

如何在不阻塞主线程的情况下使用 join() 创建多个 C++ 线程?

具有多个逻辑数据流的单套接字连接(区分数据包)