0

所以我基本上有能力从多播环境中捕获一些数据包并将它们保存到文件中,然后将它们多播到需要多播数据的应用程序。我这样做是出于模拟目的。这是一个相对简单的工具,在将 10 甚至 50K 数据包重播到运行在 gdb 中的应用程序时,它非常有用。我的重播循环如下所示:

for (size_t i = 0; i < packets_.size(); ++i)
    publisher_.publish(packets_[i].buf_, packets_[i].len_);

问题是,当 packet_.size() 大约为 100-200K 时(我永远不需要做更多的事情),当有人在听时,我似乎会遇到丢包。我猜这是因为它们是连续播放的。如果我尝试过这样的事情:

for (size_t i = 0; i < packets_.size(); ++i)
{
    if (i % Y == 0) usleep(X);
    publisher_.publish(packets_[i].buf_, packets_[i].len_);
}

对于不同的数量YX(如 1000/1000 和许多其他组合),但这不是很好。我的猜测是,如果我可以在非常短的时间内忙于每次迭代的咀嚼周期,我可以修补这个问题。忙着咀嚼,因为我不想屈服于其他进程,因此花费的时间比预期的要长,但时间非常短,甚至不到一毫秒,因为这需要等待 200 秒才能多播数据包。在循环中重复调用 sleep 函数似乎会让我大大减慢速度,这就是为什么我想知道旋转四分之一、五分之一、半毫秒左右(大约)的简单方法是什么?

或者是否有更好、更简单的方法来为这个用例打补丁?

4

2 回答 2

1

下面的功能使系统在一段时间内保持“忙碌”:

static long slow( volatile long l ) {
   while ( l-- > 0 )  ;
   return l ;
}

取一些数字,比如 1000,然后运行slow( N ),同时计算clock_t t = clock()调用前后花了多长时间。增加 N,并重复相同的操作,直到找到使循环保持忙碌 1 秒的数字 N。您现在将拥有一个功能和一个号码,可以让系统保持忙碌一秒钟。

希望它会有所帮助。

于 2012-10-19T21:23:30.377 回答
1

这是一个繁忙的等待循环:

#include <chrono>

auto start = std::chrono::high_resolution_clock::now();
while(std::chrono::high_resolution_clock::now()-start < std::chrono::nanoseconds(500))
    ;

您可以等待的实际最短时间取决于您的实现的 high_resolution_clock 的分辨率。不幸的是,VS2012还没有一个像样的实现。boost::chrono 也可以使用,它要好得多。

如果您正在寻找真正随机的时间,您可以使用该<random>库:

#include <random>

std::mt19937 eng;
std::uniform_int_distribution<> dist(200,800);

auto delay = std::chrono::nanoseconds(dist(eng));

这是 c++11 版本的 usleep,当你确实想放弃 CPU 时。

#include <thread>

std::this_thread::sleep_for(std::chrono::nanoseconds(500));
于 2012-10-19T21:31:13.813 回答