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++。你们对我如何实施新的检查方法有什么建议吗?将不胜感激。

4

2 回答 2

0

/proc/[pid]/task属于进程 [pid] 的每个线程都有一个(从 Linux 2.6.0-test6 开始)目录。查看man proc以获取文档。假设您知道线程池的 pid,您可以只计算这些目录。

您可以使用 boost::filesystem 从 c++ 执行此操作,如下所述:

如何使用 boost::filesystem 计算目录中的文件数?

我假设您使用的是 Linux。

于 2012-05-16T14:23:10.237 回答
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 可能需要相同的权限来递增它。

您还需要担心正确编码...谁拥有对象以及异常和错误等...

于 2012-05-16T14:25:57.160 回答