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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章