等待24小时的线程的潜在系统成本
Potential System cost of a thread which waits 24 hours
在我编写的应用程序中,我希望每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时间浪费(考虑到这将在系统上持续运行很长一段时间,而且它不会是系统上唯一运行的进程)。
Sleep()通常是内核中有序delta队列中的一个额外条目,因此必须在容器中维护一个最小的额外指针-成本确实可以忽略不计。线程在睡眠时根本不需要给它任何CPU。也就是说,这种长延迟操作通常是通过预定的任务或计时器来实现的,但总体而言并没有太多。
编辑-也易于测试。写一个琐碎的应用程序,启动5000个线程,除了睡眠(24小时)什么都不做。运行它,检查它的CPU使用情况。它将是0。
相关文章:
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 为什么在读取文件大小时文件IO速度会发生变化
- 错误处理.将系统错误代码映射到泛型
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- 如何在24位SDL_Surface上设置像素的颜色
- 时间转换为 24 小时格式 cpp
- 一直在尝试在 c++ 中将 12 小时制格式转换为 24 小时制格式
- 12小时到24小时的时间转换
- 以 24 小时格式比较 C/C++ 中的小时数
- C++ :将时间从 12 小时转换为 24 小时的类,无法识别自己的数据字段
- 检查OSX是否在24小时内运行
- 等待24小时的线程的潜在系统成本
- 两个时间之间经过的时间,格式为24小时hh:mm:ss
- 我正在尝试创建一个使用布尔表达式在 24 小时制和 12 小时制之间切换的函数
- Boost Timer 24小时格式
- C功能从iOS设备设置中查找iOS用户12/24小时偏好
- 在c++中将24小时时间转换为整数值
- 如何使用iMacros设置24小时操作?