2010-10-22 28 views
0

我的一位朋友正在嘗試修復一個用C++編寫的自定義http服務器,用於在Linux中工作。我試圖幫助他,但我發現的一切似乎都很明顯。Linux C++線程已死,但「掛起」 - 線程限制

該應用程序爲每次請求進入時創建一個線程。該線程爲請求提供服務並結束。經過一些請求(超過300個)後,不再創建新的線程。

我發現的所有內容都是可以創建的線程的限制。但看起來完成的線程仍然存在。這是代碼的問題還是線程處理程序永遠不會被釋放?

這是一段代碼我的朋友從應用程序中提取:

pthread_t threadID; 

StartingArgs *arg = new StartingArgs(&(this->cameraCounts), mapToSend,&(this->mapMutex), &(this->mutex), this->config); 

if(pthread_create(&threadID, NULL, (this->startingRoutine) , (void*)arg) != 0) 
    { 
     ConsoleMessages::printDate(); 
     cout<< "snapshot maker: new thread creation failed\n"; 
    } 

void *CameraCounter::startingRoutine(void *arg) 
{ 
//stuff to do. removed for debugging 

    delete realArgs; 
    return NULL; 
} 

回答

7

看起來你有一堆「可連接」的線程。他們正在等待某人對他們調用pthread_join()。如果你不想這樣做(讓線程的返回值,例如),您可以創建線程爲「分離」:

pthread_t threadID; 
pthread_attr_t attrib; 

pthread_attr_init(&attrib); 
pthread_attr_setdetachstate(pthread_attr_t &attrib, PTHREAD_CREATE_DETACHED); 

StartingArgs *arg = new StartingArgs(&(this->cameraCounts), mapToSend,&(this->mapMutex), &(this->mutex), this->config); 

if(pthread_create(&threadID, &attrib, (this->startingRoutine) , (void*)arg) != 0) 
{ 
     ConsoleMessages::printDate(); 
     cout<< "snapshot maker: new thread creation failed\n"; 
} 

pthread_attr_destroy(&attrib); 

void *CameraCounter::startingRoutine(void *arg) 
{ 
//stuff to do. removed for debugging 

    delete realArgs; 
    return NULL; 
} 
+0

謝謝。我記得看到一個版本,有一個在pthread_join調用,它並沒有幫助的代碼,但是這看起來不錯。 – naugtur 2010-10-23 20:55:14

+0

加入可能是有用的,但在這樣一個設置,它會導致線程串行化,這是不是你想要的。 – 2010-10-25 03:21:34

2

你必須加入線程(pthread_join,也看到wait(2))後完成或設置SIGCHILD處理程序SIG_IGN。

+0

他在某些時候加入了他們,但似乎沒有幫助。線程正在接合,但仍然不會死亡。 – naugtur 2010-10-23 20:57:46

2

我會推薦你​​的朋友創建一個線程池,並將工作項目發佈到線程池。如果有可用的線程來服務工作項目,一個線程分配,並考慮到工作項目。如果沒有線程可用,請求應掛起,直到有新線程可用。通過這種方式,他可以防止在拒絕服務攻擊期間耗盡太多系統資源。

如果在任何時候處理不超過30個請求的可能性不大,那麼線程池應該包含至多30個線程。然後,系統資源分配將服務拒絕攻擊時是可預見的,而不是依賴於任意系統的限制。

+0

這是作爲服務器要求在高峯3個併發連接一個明智的做法,但正如我所說,他只是支持代碼別人寫的和這個問題的重點是速戰速決。我建議他做你在這裏寫的東西。這又是那些商業原因...... – naugtur 2010-10-23 20:53:08