В приложении, которое я пишу, я хочу делать резервные копии данных каждые 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 часа, прежде чем проснуться, предположительно, поток будет восстановлен в различных точках планировщиком / ОС, чтобы проверить временные условия, и я был обеспокоен тем, приведет ли это к значительному расходу энергии или времени ЦП, которое будет пренебрегать ничем (учитывая, что это будет работать в системе постоянно в течение очень долгого времени, и это будет не единственный процесс, запущенный в системе).
Sleep (), как правило, является дополнительной записью в упорядоченной дельта-очереди в ядре, поэтому в контейнере должен поддерживаться минимальный дополнительный указатель — стоимость действительно незначительна. Нет необходимости давать потоку какой-либо процессор вообще, пока он спит. Тем не менее, такие операции с большой задержкой обычно выполняются запланированными задачами или таймерами, но в целом их не так много.
Редактировать — также легко проверить. Напишите тривиальное приложение, которое запускает 5000 потоков, которые ничего не делают, кроме сна (24 часа). Запустите его, проверьте его использование процессора. Это будет 0.
Других решений пока нет …