2017-10-19 217 views
0

我在寫一個基於C++的多線程聊天服務器。如何銷燬線程對象

當新客戶端加入時,主線程創建一個新線程來管理客戶端。

我想在客戶端斷開連接時銷燬線程,所以我正確地設置了這個功能,以便當客戶端發送退出消息Terminate()被調用時。

但Terminate(),而不是銷燬只是單個線程,它銷燬了所有的線程。

應該做什麼,以便只有我想銷燬的線程被銷燬?

+1

嗯。通常,線程從主函數返回時結束。 – Scheff

+0

你確定這是你想要的設計嗎?這是後來的可擴展性問題的祕訣 –

+0

@David Hamim我正在爲12年級計算機科學項目製作這個項目。 因此,可擴展性和效率並不是我關心的問題,因爲我自己對自己的水平非常高級(課程大綱是C++基礎知識,類,數據處理和鏈接列表堆棧和隊列。) – Vedant

回答

2

你不必做任何特別的事情。

std::thread在構造函數中獲得一個可調用的參數,而callable是線程運行的函數。

如果這個callable在某個點結束,分離的線程可以自行清理。 只要確保

  • 退出客戶端處理功能,當客戶端斷開
  • 拆卸螺紋

一個簡單的設計,可與此類似:

while(server.is_on()){ 
    auto client = server.acccept_client(); 
    std::thread thread([client = std::move(client)]{ 
    handle_client_until_disconnection(client); 
    }); 
    thread.detach(); 
} 

另一種方法是使用線程池。該線程池在應用程序啓動時構建,並在應用程序退出時銷燬。

+0

Thankyou @David Hamim – Vedant