我有一个多线程系统,其中有 x 个线程同时向网络发送数据包。
这一切对任何花花公子来说都工作得很好,但是我想限制某些线程的速度以便以一定的速率发送数据包。
因此,我在数据包注入(inject)循环中加入了 sleep ,它很好地减慢了小速度的线程速度(1 Mbps 到 70 Mbps 左右),但是如果我想将其限制为 1 Gbps,那么我就无法达到该速度 sleep 就位。现在我知道它可以达到这个速度,因为如果我从所有线程中删除 sleep ,它们每个线程可以以近 2Gbps 的速度注入(inject)。
因此,作为测试,我用 sleep 代替了
usleep(0);
我相信这应该能让速度再次恢复到满速,但事实并非如此,它仍然受到限制(只能达到最大速度的 1/20 左右)。所以我当前唯一的解释是,即使对于 sleep(0),线程也会让步,因此没有线程获得足够的执行时间。
所以,抱歉这么长的解释,但是有没有更好的方法让我的线程休眠而不造成这样的性能损失?
我尝试过 usleep 和 nanosleep,两者结果相同。所有测试的设置相同,即线程数
系统:CentOS、pthreads、g++ 4.4.6
最佳答案
考虑在注入(inject)的每个 n
个数据包中添加 sleep
调用,而不是简单地在每次迭代中添加。这样,您就不会在每个注入(inject)的数据包上遭受线程切换惩罚,并且您可以以相当细粒度的方式控制 sleep 量。
关于c++ - sleep 限制了线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14998343/