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;  
}

 

posted @ 2024-03-31 18:08  He_LiangLiang  阅读(17)  评论(0编辑  收藏  举报