C++11 如何使用Boost asio实现连接池?

C++11 如何使用Boost asio实现连接池?,c++11,concurrency,boost-asio,connection-pooling,C++11,Concurrency,Boost Asio,Connection Pooling,我有数千个并发的客户端线程,请求为C10Ksynchronized,当请求出现时更新tcp连接可能很耗时,而且如果并发线程的数量增加,它就无法扩展 因此,我认为共享连接(tcp)池对我来说可能是一个不错的选择,池中的所有连接(tcp)都被激活,所有请求共享池,需要发送消息时退出,接收消息时推入 但我如何才能做到这一点?顺便说一下,我的服务器端采用了多线程异步模式 连接件代码(客户端): 连接池(客户端)的段代码: 类连接池{ 私人: std::队列池; std::互斥mtx; std::条件变量

我有数千个并发的客户端线程,请求为C10Ksynchronized,当请求出现时更新tcp连接可能很耗时,而且如果并发线程的数量增加,它就无法扩展

因此,我认为共享连接(tcp)池对我来说可能是一个不错的选择,池中的所有连接(tcp)都被激活,所有请求共享池,需要发送消息时退出,接收消息时推入

但我如何才能做到这一点?顺便说一下,我的服务器端采用了多线程异步模式

连接件代码(客户端):

连接池(客户端)的段代码:

类连接池{
私人:
std::队列池;
std::互斥mtx;
std::条件变量no\u为空;
公众:
连接池(整数大小){

std::cout“具有C10K阻塞请求的并发客户端线程”是什么意思?阻塞请求很容易通过一开始不侦听/接受来实现。如果您指的是“阻塞”(如:同步)请求,那么池真的没有帮助。“数千个并发客户端线程”-这对任何类型的高性能服务器来说都是一个巨大的反模式你的意思是“如何创建线程池”吗?我创建了连接池(用于保持与许多服务器的空闲连接),但这个问题让meSorry困惑不解-)抱歉让你困惑不解-)我不擅长这些概念,这里是“阻塞”表示我的请求(发送和接收)处于同步模式。“具有C10K阻塞请求的并发客户端线程”这意味着大约1k个并发线程,在每个线程中每有限的微秒调用请求几次。这是C10K,不是吗?如果你成功,但我认为你不会,因为有1k个线程,线程调度和同步将主导运行时。
class SyncTCPClient {
public:
    SyncTCPClient(const std::string &raw_ip_address, unsigned short port_num) :
            m_ep(asio::ip::address::from_string(raw_ip_address), port_num), m_sock(m_ios) {
      m_sock.open(m_ep.protocol());
    }
    void connect() {
      m_sock.connect(m_ep);
    }
    //...
private:
    asio::io_service m_ios;
    asio::ip::tcp::endpoint m_ep;
    asio::ip::tcp::socket m_sock;
};
class ConnectionPool {
private:
    std::queue<std::shared_ptr<SyncTCPClient>> pool;
    std::mutex mtx;
    std::condition_variable no_empty;
public:
    ConnectionPool(int size) {
      std::cout << "Constructor for connection pool." << std::endl;
      for (int i = 0; i < size; i++) {
        std::shared_ptr<SyncTCPClient> cliPtr = std::make_shared<SyncTCPClient>(raw_ip_address, port_num);
        cliPtr->connect();
        pool.push(cliPtr);
      }
    }
    //...
};
  std::shared_ptr<asio::ip::tcp::socket> sock = std::make_shared<asio::ip::tcp::socket>(m_ios);
  m_acceptor.async_accept(*sock.get(),
                          [this, sock](const boost::system::error_code& error) {
                              onAccept(error, sock);
                          }
  );