2012-05-16 54 views
2

每個連接每個連接都需要一個線程,目前我們每個週期只允許一定數量的連接。因此,每當用戶連接時,如果我們在上次設置檢查時間的某個時間段內,就會增加計數器。允許連接給定服務器中的線程數

1.get current_time = time(0) 
2.if current_time is OUTSIDE certain period from check_time, 
    set counter = 0, and check_time = current_time. 
3.(otherwise, just leave it the way it is) 
4.if counter < LIMIT, counter++ and return TRUE 
5.Otherwise return FALSE 

但這是獨立的,我們實際上多少個線程的服務器上運行,所以我想了一個辦法,允許根據這個數字連接。

問題是我們實際上使用第三方API,我們不知道連接將持續多久。首先,我想創建一個子線程並在其上運行ps以將結果傳遞給父線程,但似乎需要更多時間,因爲我必須解析輸出結果以獲取線程總數,等我其實不知道我是否有任何意義..順便說一下,我使用C++。你們對我如何實施新的檢查方法有什麼建議嗎?這將非常感激。

+0

你能提供有關第三部分API你使用任何細節? – Greg

+0

你在你的問題中提到'ps',但是你能告訴我們你正在使用哪個操作系統嗎? – snies

+0

@Greg,我自己對這個api不是很熟悉。但在我看來,我應該有一個邏輯來決定是否在連接函數中返回true/false,並且實際的連接部分將由API。 – user945216

回答

0

好的,如果你知道連接使用的線程的TID,那麼你可以在一個單獨的線程中等待該對象,然後可以遞減計數器。

至少我知道,你可以用MSVC做到這一點...

bool createConnection() 
{ 
    if(ConnectionMonitor::connectionsMaxed()) 
    { 
     LOG("Connection Request failed due to over-subscription"); 
     return false; 
    } 
    ConnectionThread& connectionThread = ThreadFactory::createNewConnectionThread(); 
    connectionThread.startConnection(); 
    ThreadMonitorThread& monitor = ThreadFactory::createThreadMonitor(connectionThread); 
    monitor.monitor(); 
} 

和ThreadMonitorThread

ThreadMonitorThread(const Thread& thread) 
{ 
    this.thread = thread; 
} 

void monitor() 
{ 
    WaitForSingleObject(thread.getTid()); 
    ConnectionMonitor::decrementThreadCounter(); 
} 

當然ThreadMonitorThread將需要一些特殊的權限調用減量和的ThreadFactory將可能需要相同的增量。

您還需要擔心正確編碼這件事......誰擁有大約異常和錯誤等的對象,什麼...

相關問題