Таким образом, у меня есть возможность захватывать некоторые пакеты из многоадресной среды, и я сохраняю их в файл, а затем отправляю их многоадресно в приложения, которые ожидают многоадресные данные. Я делаю это для целей моделирования. Это относительно простой инструмент, и он хорошо мне пригодился при воспроизведении пакетов по 10 или даже 50 КБ в приложение, работающее в GDB. Мой цикл воспроизведения выглядит так:
for (size_t i = 0; i < packets_.size(); ++i)
publisher_.publish(packets_[i].buf_, packets_[i].len_);
и проблема в том, что когда packet_.size () составляет около 100-200 КБ (мне никогда не нужно было бы делать больше, чем это), я, кажется, испытываю потерю пакетов, когда кто-то слушает. Я предполагаю, что это потому, что они воспроизводятся в одном непрерывном пакете. Если бы я попробовал такие вещи, как:
for (size_t i = 0; i < packets_.size(); ++i)
{
if (i % Y == 0) usleep(X);
publisher_.publish(packets_[i].buf_, packets_[i].len_);
}
на разные суммы в Y
а также X
(например, 1000/1000 и многие другие комбинации), но это не очень хорошо работает. Я предположил, что я мог бы исправить это, если бы я мог загружать циклы жевания на каждой итерации в течение очень небольшого промежутка времени. Занят, потому что я не хочу уступать другим процессам и поэтому занимаю больше времени, чем ожидалось, но очень маленькое количество, даже не миллисекунду, потому что это потребовало бы 200 секунд ожидания многоадресной рассылки пакетов. Похоже, что повторяющиеся вызовы в цикле для функции сна значительно уступают и замедляют меня, поэтому мне было интересно, каким будет простой способ вращаться, возможно, на четверть, пятую, половину или около того миллисекунды (примерно)?
Или если бы был лучший и простой способ исправить это для этого варианта использования?
Приведенная ниже функция удерживает систему «занятой» в течение некоторого неопределенного времени:
static long slow( volatile long l ) {
while ( l-- > 0 ) ;
return l ;
}
Возьмите некоторое число, скажем, 1000, а затем запустите slow( N )
и в то же время посчитайте, сколько времени заняло clock_t t = clock()
до и после звонка. Увеличивайте N и повторяйте ту же операцию, пока не найдете число N, которое будет держать петлю занятой в течение 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));
Вот версия usleep для C ++ 11, когда вы хотите отказаться от процессора.
#include <thread>
std::this_thread::sleep_for(std::chrono::nanoseconds(500));