0

0

C++如何实现定时器功能_C++跨平台简单定时器代码实现【源码】

穿越時空

穿越時空

发布时间:2026-02-06 14:45:06

|

841人浏览过

|

来源于php中文网

原创

用std::thread+sleep_for可实现跨平台定时器:启分离线程循环等待并执行回调,用steady_clock控制精度,避免system_clock跳变;需atomic标志或condition_variable安全停止,注意单位指定和对象生命周期。

c++如何实现定时器功能_c++跨平台简单定时器代码实现【源码】

std::thread + std::this_thread::sleep_for 实现最简跨平台定时器

不需要第三方库,C++11 起就能跑通所有主流平台(Windows/macOS/Linux)。核心思路是:启动一个分离线程,循环等待+执行回调,靠 std::chrono 控制精度。

常见错误是直接在主线程里用 sleep_for 阻塞——这会让整个程序卡住,不是“定时器”,只是“延时暂停”。真正定时器必须异步。

  • std::thread 启动后台线程,立即调用 detach() 或管理其生命周期(推荐用 std::unique_ptr 持有)
  • 每次循环开头计算下次触发时间点(std::chrono::steady_clock::now()),再用 sleep_for 补足间隔,避免累积误差
  • 回调函数需捕获外部变量时,注意生命周期——若定时器比捕获对象活得久,会崩溃。建议传值或用 std::shared_ptr
  • Windows 下 sleep_for 最小分辨率约 15ms,Linux/macOS 通常更准;要求亚毫秒级请换 epoll/kqueue 或专用库

如何安全停止定时器(避免资源泄漏和竞态)

裸线程 + while(running) 是常见写法,但 running 变量必须是 std::atomic,否则可能被编译器优化掉读取,导致线程永不退出。

更可靠的做法是用 std::condition_variable 配合 std::mutex,让停止请求能立刻唤醒休眠中的线程,而不是等下一次循环才检查标志位。

立即学习C++免费学习笔记(深入)”;

  • 停止时先置标志,再调用 notify_one() 打断 wait_for
  • 不要在线程函数里直接 join() 自己——会导致死锁;应在控制对象的析构中 join()
  • 若使用 detach(),确保回调不访问已销毁对象,否则是未定义行为,调试极难定位

std::chrono 时间单位选错导致定时不准

sleep_for(1000) 是错的——它睡的是 1000 个 std::chrono::system_clock::period(通常是纳秒),不是毫秒。必须显式指定单位。

ThinkAny
ThinkAny

一个RAG驱动的AI搜索引擎,由独立开发者idoubi开发

下载

正确写法只有两种:

  • std::this_thread::sleep_for(std::chrono::milliseconds(1000))
  • std::this_thread::sleep_for(1s)(C++14 起支持字面量,需包含

混用 system_clocksteady_clock 也会出问题:system_clock 可能因系统时间调整跳变,定时器周期忽长忽短;必须用 steady_clock 做间隔计算。

要不要用 boost::asio::steady_timer

如果项目已依赖 Boost,且需要高并发、大量定时器(如每秒上千次)、或与网络 I/O 统一调度,boost::asio::steady_timer 是更稳的选择。它底层复用 epoll/kqueue/IOCP,无额外线程开销。

但纯做简单轮询任务(比如每 5 秒查一次配置文件),引入 Boost 反而增加构建复杂度和二进制体积。标准库方案足够用,也更容易审计和移植。

真正容易被忽略的是信号安全:在 SIGALRMsetitimer 方案里,回调函数不能调用非异步信号安全函数(如 mallocstd::cout);而线程方案没这限制,但要自己管好数据竞争。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

98

2023.09.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

610

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

610

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

87

2025.12.01

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

952

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1137

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

814

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

456

2023.08.02

1688阿里巴巴货源平台入口与批发采购指南
1688阿里巴巴货源平台入口与批发采购指南

本专题整理了1688阿里巴巴批发进货平台的最新入口地址与在线采购指南,帮助用户快速找到官方网站入口,了解如何进行批发采购、货源选择以及厂家直销等功能,提升采购效率与平台使用体验。

33

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.6万人学习

Git 教程
Git 教程

共21课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号