C++ 允许给定服务器中线程数的连接

C++ 允许给定服务器中线程数的连接,c++,C++,每个连接都需要一个线程,目前,每个周期只允许一定数量的连接。因此,每当用户连接时,如果我们在上次设置检查时间后的某个时间段内,我们就会增加计数器 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 i

每个连接都需要一个线程,目前,每个周期只允许一定数量的连接。因此,每当用户连接时,如果我们在上次设置检查时间后的某个时间段内,我们就会增加计数器

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
1.get current\u time=time(0)
2.如果当前检查时间超出检查时间的一定时间段,
设置计数器=0,并检查时间=当前时间。
3.(否则,就让它保持原样)
4.如果计数器<限制,计数器+,并返回TRUE
5.否则返回FALSE
但这与服务器中实际运行的线程数无关,因此我正在考虑一种方法,根据这个数量允许连接


问题是我们实际上正在为此使用第三方api,我们不知道连接将持续多久。首先,我想创建一个子线程,并在其上运行ps以将结果传递给父线程,但这似乎需要更多的时间,因为我必须解析输出结果以获得线程总数,等等。实际上,我不确定我是否有意义。。顺便说一下,我使用C++。你们对我如何实施新的检查方法有什么建议吗?非常感谢

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

可以使用Boosi::文件系统从C++中实现这一点,如这里所描述的:


我假设您正在使用Linux

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

可以使用Boosi::文件系统从C++中实现这一点,如这里所描述的:


我假设您正在使用Linux

好的,如果您知道连接使用的线程的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可能需要相同的特权来增加减量


您还需要担心如何正确地将其编码。。。谁拥有这些对象,以及异常和错误等情况如何

好的,如果您知道连接使用的线程的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可能需要相同的特权来增加减量


您还需要担心如何正确地将其编码。。。谁拥有这些对象,以及异常和错误等情况如何

您能提供您使用的第三方API的详细信息吗?您在问题中提到了
ps
,但您能告诉我们您使用的是哪个操作系统吗?@Greg,我自己对这个API不太熟悉。。但在我看来,我应该有逻辑来决定是否在connect函数中返回true/false,而实际的连接部分将由api处理。@snies,是的,我正在使用linux,感谢您在下面的回复@user945216,您能告诉我它的名字吗?还是它是专有的解决方案?也许这个API本身有一种限制连接数量的方法?你能给出你使用的第三方API的详细信息吗?你在问题中提到了
ps
,但是你能告诉我们你使用的是哪个操作系统吗?@Greg,我自己对这个API不太熟悉。。但在我看来,我应该有逻辑来决定是否在connect函数中返回true/false,而实际的连接部分将由api处理。@snies,是的,我正在使用linux,感谢您在下面的回复@user945216,您能告诉我它的名字吗?还是它是专有的解决方案?也许这个API本身有一种限制连接数的方法?