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时间浪费(考虑到这将在系统上持续运行很长一段时间,并且它不会是系统上唯一运行的进程)。
似乎很愚蠢。为什么不只是设置一个cron作业(或Windows的at命令)来运行你的程序呢? –
@JohnDibling - cron作业和其他进程外调度程序对于许多任务来说并不方便。例如,如果要在复制之前刷新数据并关闭文件,通常很难通知作业已准备就绪等。线程通常更简单。 –