2015-11-10 86 views
-1

我想寫一個簡單的C++聊天服務器。簡化:具有多線程的C++服務器

  void clientThread(int sock){ 
       // receives data on socket and sends to all other client's 
     //sockets which are held in a vector, when received data<0 thread is 
    // finished and client is removed from a vector 
      } 

主迴路:

   vector<thread> th; 
       while(1){ 
       memset(&rcvAddr,0,sizeof(sockaddr_in)); 
       sock=accept(connectSocket,NULL,(socklen_t*)&addrLength); 
       cout << "client connected from: " << inet_ntoa(rcvAddr.sin_addr)<< endl; 
       if(sock<0) 
        continue; 
       mtx.lock(); 
       clientDescriptors.push_back(sock); 
       mtx.unlock(); 
       th.pushback(thread(&server::clientThread,this,sock)); 
      } 

而且我有最後一行的問題。這個矢量不斷增長,你知道任何正確的方式來管理?如何產生這些線程?是否有任何實施的數據結構或類似的東西來管理線程?我讀了關於線程池,但我認爲這並不能解決這個問題。

+1

你不斷反覆推動相同的函數。 –

回答

0

一(正確)的設計可以是:

  • ,其管理一個連接隊列
  • 其接受插座反覆

甲監聽線程一個線程池一個僞代碼可以是:

main: 
    launch thread pool 
    launch the listening thread 
    block until server is not neaded 

listening thread routine: 
    while true 
    accept a client socket 
    build a task out of the client socket 
    push the task into the connection queue 

task是實際功能/函數對象/對象對socket做一些有意義的事情,比如讀取內容,將結果寫入客戶端,關閉套接字。

+0

問題是爲線程分配內存,在C++中我們需要一個變量。在python中,我們可以使用thread.start_new_thread(threadFunction,(arg))。我們這裏沒有任何變量,我們可以使用它產生多個線程,在C++中沒有任何類似的東西? – Auroth21

+0

你正是用'std :: thread t(threadFunction,args ...)'來做的,閱讀文檔 –

0

它會不斷增長,因爲這是你所做的 - 你爲每個連接創建一個線程。偶爾線程退出,但你永遠不會從這個向量中移除元素,因爲你沒有加入線程。

最好的辦法是自動加入矢量中所有可連接的線程,但是對於我正在進行的令人沮喪的posix,完全沒有這個功能 - 一次只能加入一個線程。 Posix傲慢地聲稱如果你認爲你需要這個功能,你可能需要重新考慮你的應用程序設計。 - 我不同意。無論如何,你可以做的一件事就是使用線程池 - 它們將幫助你。