2017-02-24 21 views
0

我跑了255線程,試圖連接到某個服務器。 但它花了很多時間(10秒),直到所有的線程完成。 如果某個線程成功連接,則由ref發送的SOCKET將填充該服務器的ID。有沒有更快的有效的方式來運行這樣的255個線程? CPP

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在這個線程。

+0

你已經試過特別的東西需要很長時間嗎?我的意思是你做了一些時間測量? – retinotop

+0

是的。 「連接」功能。這是C線程的正常連接。我只是扭曲了它。 –

+0

運行需要多長時間1連接1個螺紋? 2線程連接怎麼樣? – Alek86

回答

4

創建線程一般很昂貴。一個可以佔用8MB的RAM。他們有很大的開銷。網絡編程最常用的方法是使用很少線程的某種異步解複用。

看看http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio.html並獲得一些見解。我建議你研究它,因爲ISO委託人已經在制定一個技術規範,標準網絡庫將基於Asio。

如果你想並行運行很多I/O綁定的東西,你想要的是基於回調的鏈接流,協程或者期貨+延續,只有一個或很少的線程。

這不是一個簡單的話題,但會給你很多正確的做法的見解。我建議你看看例子。瞭解該庫需要一些時間。

+0

你認爲這會對時間有幫助嗎?如果連接需要1/25秒,我認爲時間結果將是相同的 – Alek86

+0

我不想使用外部庫。我想了解如何構建這些庫。 –

+0

@FeQlw這個想法是一樣的:在不使用255個線程的情況下使你的代碼異步,但是你會用普通的BSD風格的套接字來做這件事。 –

相關問題