使用std::chrono和std::thread可实现高精度跨平台计时器,支持单次与周期性任务。1. 通过steady_clock测量时间间隔;2. 结合sleep_until实现延时执行;3. 封装Timer类管理线程安全的定时任务;4. 多定时任务宜用优先队列统一调度以提升效率。

在C++中实现一个计时器(Timer),尤其是结合多线程和高精度时间测量时,需要使用现代C++标准库中的 std::chrono 和 std::thread。这种方式不仅跨平台,而且能提供微秒甚至纳秒级的精度。
1. 使用 std::chrono 实现高精度时间测量
C++11 引入了 std::chrono,它提供了对时间点(time_point)、时间段(duration)和时钟(clock)的封装,适合做高精度计时。
常用时钟类型:
std::chrono::steady_clock:单调递增,不受系统时间调整影响,推荐用于计时。std::chrono::high_resolution_clock:最高精度时钟,通常就是 steady_clock 的别名。
示例:测量代码执行时间
立即学习“C++免费学习笔记(深入)”;
#include #includeint main() {auto start = std::chrono::steady_clock::now();
// 模拟耗时操作for (int i = 0; i < 1000000; ++i) { // do nothing}auto end = std::chrono::steady_clock::now();auto duration = std::chrono::duration_cast(end - start);std::cout << "耗时: " << duration.count() << " 微秒n";return 0;
}
2. 实现单次/周期性定时任务(Timer)
可以利用 std::thread 和 std::this_thread::sleep_until 来实现一个简单的定时器。
目标:在指定时间后执行函数,或周期性执行。
#include #include #include #includevoid simple_timer(int delay_ms, std::function task) {auto wake_time = std::chrono::steady_clock::now() +std::chrono::milliseconds(delay_ms);std::this_thread::sleep_until(wake_time);task();}
// 周期性执行void periodic_timer(int interval_ms, int times, std::function task) {for (int i = 0; i < times; ++i) {auto next_time = std::chrono::steady_clock::now() +std::chrono::milliseconds(interval_ms);task();std::this_thread::sleep_until(next_time);}}
调用示例:
int main() { simple_timer(1000, []() { std::cout << "1秒后执行n"; });periodic_timer(500, 3, []() { std::cout << "周期任务执行n";});return 0;
}
3. 多线程安全的 Timer 类设计
如果要支持多个定时任务并行运行,应将每个定时器放在独立线程中,避免阻塞主线程。
class Timer {public: Timer() : running(false) {}~Timer() { stop();}void start_once(int delay_ms, std::function task) { stop(); running = true; thread = std::thread([=]() { auto target = std::chrono::steady_clock::now() + std::chrono::milliseconds(delay_ms); std::this_thread::sleep_until(target); if (running) task(); });}void start_periodic(int interval_ms, std::function task) { stop(); running = true; thread = std::thread([=]() { while (running) { auto next_time = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval_ms); task(); std::this_thread::sleep_until(next_time); } });}void stop() { running = false; if (thread.joinable()) { thread.join(); }}
private:std::thread thread;bool running;};
使用方式:
int main() { Timer timer; timer.start_once(1000, []() { std::cout << "一次性任务n"; });std::this_thread::sleep_for(std::chrono::seconds(2));timer.start_periodic(300, []() { std::cout << "每300ms执行一次n";});std::this_thread::sleep_for(std::chrono::seconds(2));return 0;
}
4. 注意事项与优化建议
优先使用 std::chrono::steady_clock,避免系统时间跳变影响计时。sleep_until 虽然高精度,但实际精度受限于操作系统的调度粒度(通常为1-15ms)。频繁短间隔定时任务可能因线程调度延迟而无法精确执行,考虑使用事件循环或定时器轮询机制(如基于 epoll 或 IOCP)提升效率。若需大量定时器,可使用 std::priority_queue 管理超时任务,配合一个工作线程统一调度。
基本上就这些。C++ 中实现 Timer 不复杂,关键是选对时钟和线程控制方式。
以上就是C++怎么实现一个计时器(Timer)_C++多线程与高精度时间测量的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1485787.html
微信扫一扫
支付宝扫一扫