C++怎么实现一个计时器(Timer)_C++多线程与高精度时间测量

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

c++怎么实现一个计时器(timer)_c++多线程与高精度时间测量

在C++中实现一个计时器(Timer),尤其是结合多线程和高精度时间测量时,需要使用现代C++标准库中的 std::chronostd::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 #include 

int 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 #include 

void 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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 09:14:06
下一篇 2025年12月19日 09:14:17

相关推荐

发表回复

登录后才能评论
关注微信