首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何定期唤醒C++ 11线程?

在C++11中,线程的定期唤醒通常是通过结合使用条件变量(std::condition_variable)和互斥锁(std::mutex)来实现的。以下是一个简单的示例,展示了如何创建一个线程,该线程每隔一段时间被唤醒执行任务:

基础概念

  • 条件变量:允许线程等待某个条件成立,当条件满足时,线程被唤醒。
  • 互斥锁:用于保护共享数据,防止多个线程同时访问导致的数据竞争。

示例代码

代码语言:txt
复制
#include <iostream>
#include <thread>
#include <condition_variable>
#include <chrono>
#include <mutex>

std::condition_variable cv;
std::mutex cv_m;
bool ready = false;

void periodic_task(int interval_seconds) {
    while (true) {
        std::unique_lock<std::mutex> lk(cv_m);
        if (cv.wait_for(lk, std::chrono::seconds(interval_seconds), []{return ready;})) {
            // 条件满足,执行任务
            std::cout << "Task executed at " << std::chrono::system_clock::now().time_since_epoch().count() << std::endl;
            ready = false; // 重置条件
        } else {
            // 超时,执行周期性任务
            std::cout << "Periodic task run at " << std::chrono::system_clock::now().time_since_epoch().count() << std::endl;
        }
    }
}

int main() {
    std::thread t(periodic_task, 5); // 每隔5秒唤醒一次

    // 主线程可以做一些其他工作,或者设置条件变量来唤醒任务线程
    std::this_thread::sleep_for(std::chrono::seconds(15));
    {
        std::lock_guard<std::mutex> lk(cv_m);
        ready = true;
    }
    cv.notify_one(); // 唤醒任务线程

    t.join();
    return 0;
}

代码解释

  1. 条件变量和互斥锁初始化cv 是条件变量,cv_m 是互斥锁。
  2. 周期性任务函数periodic_task 函数使用 wait_for 方法等待指定的时间间隔。如果在等待时间内 ready 变量变为 true,则立即执行任务;否则,在超时后执行周期性任务。
  3. 主线程操作:主线程休眠15秒后设置 readytrue 并通知条件变量,从而唤醒任务线程执行一次任务。

应用场景

  • 定时任务:如定时数据备份、日志清理等。
  • 周期性检查:如网络状态监测、系统健康检查等。

注意事项

  • 确保在修改共享状态(如 ready 变量)时使用互斥锁保护,以避免竞态条件。
  • 在实际应用中,可能需要更复杂的逻辑来处理任务的取消或异常情况。

通过这种方式,可以有效地实现线程的定期唤醒和任务执行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券