【发布时间】:2011-03-15 13:45:41
【问题描述】:
我目前正在使用select() 作为计时器。我有一个循环内发生的网络接收操作,每隔几秒钟就需要进行一次处理操作。
因此,select() 语句的超时时间不断变化——随着时间的推移减少到零,然后在 3 处重新开始。
rv = select(selectmonitor+1, &readnet, NULL, NULL, &helper.timeout());
随着网络上的事情进入,该语句被重复并且由 helper.timeout() 传递给它的值减少。最终,该值要么为零,要么系统超时,这将导致处理函数执行。但是,我注意到这非常耗费资源——必须不断计算 helper.timeout() 的值。当我尝试每秒接收几千个数据包时,完成此操作所需的时间会导致数据包丢失。
我的新想法是使用SIGALRM 来解决这个问题。这将允许我设置一次计时器,然后在它关闭时做出反应。但是,我对它将如何影响我的程序感到困惑。当 SIGALRM “关闭”时,它将运行我指定的函数。但是,它将如何中断我现有的代码?一旦函数完成,我现有的代码(在while 语句中)将如何恢复?
另外,设置 SIGALRM 信号来调用类中的函数似乎是不可能的?它是否正确?我想我可以调用一个函数,该函数又可以调用一个类中的一个函数..
感谢您提前提供的任何帮助。
【问题讨论】:
标签: c++ select performance timeout signals