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

Posted

技术标签:

【中文标题】等待 24 小时的线程的潜在系统成本【英文标题】:Potential System cost of a thread which waits 24 hours 【发布时间】:2013-06-25 14:06:40 【问题描述】:

在我正在编写的应用程序中,我希望每 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 时间被浪费(考虑到这将在系统上持续运行很长时间时间,并且它不会是系统上运行的唯一进程)。

【问题讨论】:

看起来很傻。为什么不直接设置一个 cron 作业(或 Windows at 命令)来运行您的程序? @JohnDibling - cron 作业和其他进程外调度程序对于许多任务来说根本不方便。例如,如果您想在复制之前刷新数据并关闭文件,通常很难收到作业准备就绪等通知。线程通常更容易。 【参考方案1】:

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

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

【讨论】:

以上是关于等待 24 小时的线程的潜在系统成本的主要内容,如果未能解决你的问题,请参考以下文章

Java线程池详解

Java线程池详解

进程池和线程池

Python学习第24篇:死锁,递归锁,信号量,Event事件,线程Queue

死锁Lock锁等待唤醒机制线程组线程池定时器单例设计模式_DAY24

线程池