C ++ socket多线程:如何减少矢量大小

时间:2017-04-27 02:22:25

标签: c++ multithreading sockets c++11 vector

所以我在C ++ 11中学习std :: thread,我想在socket编程中使用std :: vector。

我已经搜索了std :: thread教程,在我看来很多人都在使用带有容器的std :: thread,比如std :: vector。

我的问题是:

  1. 将std :: thread与std :: vector一起使用有什么好处?

  2. 我用std :: thread和std :: vector(下面的代码)实现我的C ++套接字服务器,我发现了一个问题:

    如果客户端连接到我的服务器,我的服务器将创建一个线程并将其存储在std :: vector中,这将增加std :: vector的大小。如果该客户端再次断开连接并重新连接到我的服务器,它将再次为该连接创建一个线程并增加std :: vector大小。但是,即使完成了线程,元素仍然存在。因此,如果客户端重复连接/断开连接到我的服务器,std :: vector的大小将增加,直到机器内存不足。有没有办法检测线程是否完整(或客户端断开连接)并删除std :: vector的元素?

  3. 下面是我的实现:假设所有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;
    }
    

0 个答案:

没有答案