有没有更快,更有效的方式来运行这样的255个线程? CPP

时间:2017-02-24 14:31:44

标签: c++ multithreading

我运行了255个试图连接到某个服务器的线程。 但它花了很多时间(10秒),直到完成所有线程。 如果某个线程成功连接,则由ref发送的SOCKET将填充该服务器的id。

void TryConnect(int octet, SOCKET& soc_returned)
{
    Client temp_client;
    int first_of_last_octet = getway.find_last_of('.') + 1;
    getway = getway.replace(first_of_last_octet, 3, std::to_string(octet));
    try
    {
        temp_client.GetInfo(getway.c_str(), S_PORT);
        temp_client.CreateSocket();
        temp_client.Connect();
        soc_returned = temp_client.socket_id;
    }
    catch (...)
    {
        std::cout << octet << std::endl;
    }
}

void TryConnectOnSubnet(std::string getway)
{
    std::vector<std::thread*> threads;
    SOCKET soc_returned;
    for (int i = 1; i < 254; i++)
    {
        std::thread* t = new std::thread(&Client::TryConnect, this, i, std::ref(soc_returned));
        threads.push_back(t);
    }

    for (int i = 0; i < 253; i++)
    {
        threads[i]->join();
    }

    std::cin.get();
} 

我不明白为什么做这件事的工具太长了。有人有什么想法吗? 顺便说一句,我注意到我没有在这个帖子上激活delete

1 个答案:

答案 0 :(得分:4)

一般来说,创建线程的代价很高。一个可以占用8MB的RAM。他们的开销很大。最常用的网络编程方法是使用极少数线程进行某种异步解复用。

查看http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio.html并获得一些见解。我建议你研究一下,因为ISO委员会已经在制作一个技术规范,其中标准网络库将基于Asio。

如果你想要并行运行许多I / O绑定的东西,你想要的是一个基于回调的链接流程,协程或期货+延续,有一个或很少的线程。

这不是一个简单的主题,但会为您提供有关正确方法的大量见解。我建议你看看这些例子。理解库需要一些时间。