2013-06-25 18 views
0

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

+0

似乎很愚蠢。为什么不只是设置一个cron作业(或Windows的at命令)来运行你的程序呢? –

+1

@JohnDibling - cron作业和其他进程外调度程序对于许多任务来说并不方便。例如,如果要在复制之前刷新数据并关闭文件,通常很难通知作业已准备就绪等。线程通常更简单。 –

回答

4

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

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