2012-05-16 43 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将可能需要相同的增量。

您还需要担心正确编码这件事......谁拥有大约异常和错误等的对象,什么...

相关问题