在 Linux 下用 C++ 实现定时器,常见有几种方案,从“最简单”到“最专业”依次如下。你可以根据使用场景选择。
sleep / usleep(不推荐做定时器)适合简单延时,不适合精确或并发定时器。
#include <unistd.h>
#include <iostream>
int main() {
while (true) {
std::cout << "tick" << std::endl;
sleep(1); // 1秒
}
}
❌ 缺点:阻塞线程,无法管理多个定时器
使用 <timer.h> 的 timer_create
#include <iostream>
#include <signal.h>
#include <time.h>
void timer_handler(int sig) {
std::cout << "timer fired" << std::endl;
}
int main() {
struct sigaction sa;
sa.sa_flags = 0;
sa.sa_handler = timer_handler;
sigaction(SIGRTMIN, &sa, nullptr);
timer_t timerid;
struct sigevent sev{};
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGRTMIN;
timer_create(CLOCK_REALTIME, &sev, &timerid);
struct itimerspec its{};
its.it_value.tv_sec = 1; // 首次触发
its.it_interval.tv_sec = 1; // 周期
timer_settime(timerid, 0, &its, nullptr);
while (true) pause();
}
✅ 优点:
❌ 缺点:
std::thread + chrono(C++ 风格,简单)适合应用层逻辑
#include <iostream>
#include <thread>
#include <chrono>
void timer_loop() {
while (true) {
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "tick" << std::endl;
}
}
int main() {
std::thread t(timer_loop);
t.join();
}
✅ 优点:
❌ 缺点:
epoll + timerfd(高性能服务器首选 ⭐)这是 Linux 服务端标准做法
#include <sys/timerfd.h>
#include <unistd.h>
#include <iostream>
int main() {
int fd = timerfd_create(CLOCK_MONOTONIC, 0);
struct itimerspec its{};
its.it_value.tv_sec = 1;
its.it_interval.tv_sec = 1;
timerfd_settime(fd, 0, &its, nullptr);
uint64_t exp;
while (true) {
read(fd, &exp, sizeof(exp));
std::cout << "timer fired" << std::endl;
}
}
✅ 优点:
epoll✅ 适合:
boost::asio::steady_timerboost::asio::io_context io;
boost::asio::steady_timer t(io, std::chrono::seconds(1));
t.async_wait([](auto){ std::cout << "timeout\n"; });
io.run();
libev / libevent| 场景 | 推荐 |
|---|---|
| 简单脚本 | sleep |
| 精准定时 | POSIX timer |
| 服务器 | timerfd + epoll |
| C++ 项目 | asio / thread |
如果你愿意,可以告诉我:
我可以给你一个完整可直接用的 C++ 类。