等待24小时的线程的潜在系统成本

时间:2013-06-25 14:06:41

标签: c++ multithreading c++11 power-management

在我正在编写的应用程序中,我希望每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小时,但可能是线程将被复活在调度程序/操作系统的各个点检查时间条件,我担心这是否会导致不可忽视的功率或浪费CPU时间(考虑到这将在系统上持续运行很长时间时间,它不会是系统上运行的唯一进程。)

1 个答案:

答案 0 :(得分:4)

Sleep()通常是内核中有序delta队列中的额外条目,因此必须在容器中保留最小的额外指针 - 成本确实可以忽略不计。在休眠时,根本不需要为线程提供任何CPU。也就是说,这种长时间延迟的操作通常是由预定的任务或计时器实现的,但总体来说并不多。

编辑 - 也很容易测试。编写一个简单的应用程序,启动5000个线程,除睡眠(24小时)外什么也不做。运行它,检查其CPU使用情况。它将是0。