2015-04-05 20 views
-2

啓動多個線程我有一個類下面的方法如何在C++

void Listener::Start() 
{ 
    Logger logger; 
    std::string logMessage("Starting '" + to_utf8string(GetName()) + "' Listener"); 
    http_listener httpListener(GetUri()); 
    std::string listenerName(to_utf8string(name)); 

    logger.log(logMessage); 

    // listener recieves a GET request. 
    httpListener.support(methods::GET, [listenerName](http_request request) 
    { 
     Logger logger; 
     std::string logMessage("GET request recieved from " + listenerName); 

     logger.log(logMessage); 

     // dummy line just till routing is dealt with 
     request.reply(status_codes::OK, logMessage); 

    }); 

    // open listener and route request 
    httpListener 
     .open() 
     .then([&httpListener,listenerName](){ 
      Logger logger; 
      std::string logMessage(listenerName + "started"); 

      logger.log(logMessage); 

     }).wait(); 

    // JUST WAIT - we do not want the application to stop 
    while (true); 

} 

現在,我不知道有多少線程是 - 它基本上是從讀出的記錄數數據庫表。

for each (Listener l in ls.Select(m.GetId())) 
{ 
    l.Start(); 
} 

只有第一個線程被啓動並運行,這是合乎邏輯的,因爲阻止線程運行的唯一東西是永久循環。

但是,如果這樣運行,

std::vector<thread> listener_threads; 

    for each (Listener l in ls.Select(m.GetId())) 
    { 
     listener_threads.push_back(thread{ &Listener::Start, &l }); 
    } 

沒有任何線程正在運行 - 沒有一個偵聽器回覆任何請求。

所以問題是如何在C++應用程序中運行不確定數量的線程。

+1

'for each'對我來說看起來不像C++。 – 2015-04-05 15:32:27

+0

@JoachimPileborg,我認爲這可能是MSVC的擴展之一。考慮到這是C++ 11,但不需要它。 – chris 2015-04-05 15:37:49

+0

爲什麼選擇投票? – 2015-04-05 18:42:36

回答

0

這樣做的方法是首先收集矢量中的所有偵聽器實例。然後通過這個向量循環創建另一個實際的線程向量。

// collect all the listeners into a vector 

for (auto& m : rm.Select()) { 
    for (auto& l : ls.Select(m.GetId())) { 
     lvector.push_back(l); 
    } 
} 

// now create threads for each listener 
for (auto& lstnr : lvector) 
{ 
    listener_threads.push_back(std::thread{ &Listener::Start, &lstnr }); 
} 

// now join with this thread. 
for (auto& t : listener_threads) 
{ 
    t.join(); 
} 

正如我在每個線程的底部,而(真) - 那麼應用程序只是繼續,而在所有需要的領域聽了運行。

我認爲這可能是一個範圍問題,因爲lvector需要在for循環之外,並且它們都被添加。