C++笔记之将定时器加入向量并设置定时器的ID为i

C++笔记之将定时器加入向量并设置定时器的ID为i

code review!

文章目录


运行

代码

cpp 复制代码
#include <chrono>
#include <iostream>
#include <thread>
#include <vector>

// 定义定时器类
class Timer {
  public:
    Timer(int id, std::chrono::seconds interval) : id(id), interval(interval) {}
    void operator()() {
        std::this_thread::sleep_for(std::chrono::seconds(interval));
        std::cout << "Timer " << id << " expired!" << std::endl;
    }

  private:
    int id;
    std::chrono::seconds interval;
};

// 定义一个函数,用于将定时器加入向量并设置定时器的ID为i
void addTimer(std::vector<Timer> &timers, int i, std::chrono::seconds interval) {
    Timer timer(i, interval);
    timers.push_back(timer);
}

int main() {
    // 创建一个包含3个定时器的向量
    std::vector<Timer> timers;
    addTimer(timers, 1, std::chrono::seconds(1));
    addTimer(timers, 2, std::chrono::seconds(2));
    addTimer(timers, 3, std::chrono::seconds(7));

    // 启动定时器并等待它们到期
    for (auto &timer : timers) {
        std::thread t(std::ref(timer));
        t.detach(); // 将定时器线程分离,使其在后台运行
    }
    std::this_thread::sleep_for(std::chrono::seconds(10)); // 等待10秒钟,使所有定时器都有足够的时间到期

    return 0;
}

关于代码中的void operator()()

Timer timer(i, interval); 这一行实际上是在创建 Timer 对象,并且在这个过程中没有直接使用了 operator()() 函数调用运算符。
operator()() 函数调用运算符的使用方式是通过将 Timer 对象传递给 std::thread 的构造函数来实现的,如下所示:

cpp 复制代码
std::thread t(std::ref(timer));

这里的 timer 是一个 Timer 类型的对象。通过传递 std::ref(timer)std::thread 构造函数,你实际上在创建一个新的线程,并在这个新线程中调用了 timer 对象的 operator()() 函数。这就是代码中使用 operator()() 函数的地方。

相关推荐
码匠许师傅1 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
旖旎夜光2 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
汉字萌萌哒2 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
hy.z_7773 小时前
【C++】13. 继承
c++
汉字萌萌哒3 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
2401_890603404 小时前
C++ 继承
c++
果果燕5 小时前
C++ 学习笔记(二):类与对象—— 构造函数与析构函数
开发语言·c++
老洋葱Mr_Onion5 小时前
【C++】信息学奥赛CSP通关之路——CSP-J/S第一轮原创全真模拟试卷集(2026)卷四全卷解析
开发语言·c++
布莱克6055 小时前
理解 C/C++ 中的 void* 指针
c语言·c++
小小龙学IT7 小时前
simdjson:利用 SIMD 指令实现 GB/s 级 JSON 解析的 C++ 开源库
开发语言·c++·json