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

标签 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 时间被浪费(考虑到这将在系统上持续运行很长时间时间,它不会是系统上运行的唯一进程)。

最佳答案

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

编辑 - 也很容易测试。编写一个启动 5000 个线程的普通应用程序,这些线程除了 sleep (24 小时)外什么都不做。运行它,检查它的 CPU 使用情况。它将为 0。

关于c++ - 等待 24 小时的线程的潜在系统成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17299517/

相关文章:

c++ - 计算文本文件中单词的出现次数

c++ - 您应该在头文件中包含源代码吗?

c++ - 与 lambdas 相比,std::bind 仍然有用吗?

java - 在 Java 集合中并行搜索

c++ - 如何使用 stringstream 将数据正确存储到数组结构中?

C++ STL 算法 : get pointers of elements in container

c++ - 使用 for 循环的 OpenGL 立方体

c++ - 执行 std::thread::join() 时发出 SIGINT

multithreading - Delphi 表单创建无需卡住主线程

c++ - 返回类型中 && 和 no ref 的区别