在C++11中,线程的定期唤醒通常是通过结合使用条件变量(std::condition_variable
)和互斥锁(std::mutex
)来实现的。以下是一个简单的示例,展示了如何创建一个线程,该线程每隔一段时间被唤醒执行任务:
#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;
}
cv
是条件变量,cv_m
是互斥锁。periodic_task
函数使用 wait_for
方法等待指定的时间间隔。如果在等待时间内 ready
变量变为 true
,则立即执行任务;否则,在超时后执行周期性任务。ready
为 true
并通知条件变量,从而唤醒任务线程执行一次任务。ready
变量)时使用互斥锁保护,以避免竞态条件。通过这种方式,可以有效地实现线程的定期唤醒和任务执行。
领取专属 10元无门槛券
手把手带您无忧上云