2013-06-25 19 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.