C++单例类和线程的一个结合
一个C++的单例类,类里面定义了一个线程对象,线程对象会定时去计算一个时间,并返回这个计算出来的时间。
应用场景:
比如,有些比较消耗时间的操作,就可以放在线程里面定时计算,我们在外部定时读取。
这样就可以避免主线程被阻塞。
#include <iostream> #include <thread> #include <chrono> #include <mutex> #include <condition_variable> class TimeCalculator { public: // 获取TimeCalculator的单例实例 static TimeCalculator& getInstance() { static TimeCalculator instance; // 局部静态变量,确保只初始化一次 return instance; } // 禁止拷贝构造和拷贝赋值 TimeCalculator(const TimeCalculator&) = delete; TimeCalculator& operator=(const TimeCalculator&) = delete; // 获取当前时间 std::chrono::system_clock::time_point getCurrentTime() { std::unique_lock<std::mutex> lock(mutex); condVar.wait(lock, [this]{ return newTimeAvailable; }); newTimeAvailable = false; // 重置标志 return currentTime; } private: // 私有构造函数,确保外部不能直接创建实例 TimeCalculator() { running = true; timerThread = std::thread(&TimeCalculator::calculateTime, this); } ~TimeCalculator() { running = false; condVar.notify_all(); if (timerThread.joinable()) { timerThread.join(); } } void calculateTime() { while (running) { { std::lock_guard<std::mutex> lock(mutex); currentTime = std::chrono::system_clock::now(); newTimeAvailable = true; } condVar.notify_all(); // 通知等待的线程 // 等待10秒 std::this_thread::sleep_for(std::chrono::seconds(10)); } } std::thread timerThread; std::mutex mutex; std::condition_variable condVar; bool running; bool newTimeAvailable; std::chrono::system_clock::time_point currentTime; }; int main() { // 获取TimeCalculator的单例实例并使用 auto& tc = TimeCalculator::getInstance(); while (true) { auto time = tc.getCurrentTime(); auto time_t = std::chrono::system_clock::to_time_t(time); std::cout << "Current time: " << std::ctime(&time_t) << std::endl; // 等待一段时间再次获取时间,以便观察效果 std::this_thread::sleep_for(std::chrono::seconds(5)); } return 0; }