Потенциальная стоимость системы потока, который ждет 24 часа

В приложении, которое я пишу, я хочу делать резервные копии данных каждые 24 часа, чтобы предотвратить риск потери данных в случае повреждения файла или другого сбоя.

Для этого я использую простой поток, как это:

void BackupThread( const std::atomic<bool>& bTerminateFlag )
{
std::stringstream ssFilePathAndName;

while( !bTerminateFlag.load() )
{
std::this_thread::sleep_for( std::chrono::hours(24) );

std::time_t std::chrono::system_clock::to_time_t( std::chrono::system_clock::now() );

ssFilePathAndName << "\\Backup" << "\\BackupFile-" << std::put_time( std::localtime( &t ), "%Y-%m-%d-%H-%M-%S" ) << ".txt";

// Save the data using our thread-safe Singleton object:
g_pManager->Save( ssFilePathAndName.str() );

ssFilePathAndName.str( "" );
ssFilePathAndName.clear();
}
}

Затем я начинаю это, используя ссылку на переменную-член моего основного класса приложения:

m_backupThread = std::thread( BackupThread, std::cref( m_bBackupTerminateFlag ) );

Однако мне любопытно, является ли это неправильным способом (с точки зрения системных ресурсов) для этого процесса, потому что, хотя я и указал, что поток должен ждать 24 часа, прежде чем проснуться, предположительно, поток будет восстановлен в различных точках планировщиком / ОС, чтобы проверить временные условия, и я был обеспокоен тем, приведет ли это к значительному расходу энергии или времени ЦП, которое будет пренебрегать ничем (учитывая, что это будет работать в системе постоянно в течение очень долгого времени, и это будет не единственный процесс, запущенный в системе).

0

Решение

Sleep (), как правило, является дополнительной записью в упорядоченной дельта-очереди в ядре, поэтому в контейнере должен поддерживаться минимальный дополнительный указатель — стоимость действительно незначительна. Нет необходимости давать потоку какой-либо процессор вообще, пока он спит. Тем не менее, такие операции с большой задержкой обычно выполняются запланированными задачами или таймерами, но в целом их не так много.

Редактировать — также легко проверить. Напишите тривиальное приложение, которое запускает 5000 потоков, которые ничего не делают, кроме сна (24 часа). Запустите его, проверьте его использование процессора. Это будет 0.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]