簡體   English   中英

是否可以限制成員函數訪問成員變量?

[英]Is it possible to restrict a member function from accessing a member variable?

我有一個與此類似的線程類:

class thr {
    void run() {
        for (;;) {
            // block on a queue
            // do some processing
            ++loops_;
        }
    }

    void get_metrics(int& qps) {
        std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
        double delta = std::chrono::duration<double>(now - last_metrics_time_).count();
        qps = std::round(loops_ / delta);
        loops_ = 0;
        last_metrics_time_ = now;
    }

    static std::atomic<int> loops_;
    static std::chrono::steady_clock::time_point last_metrics_time_;
};

std::atomic<int> thr::loops_ { 0 };
std::chrono::steady_clock::time_point thr::last_metrics_time_ {
    std::chrono::steady_clock::now() // initial value: when the program starts
};

這種運行有很多例子。 還有另一個線程不時調用get_metrics()。

我想阻止run()能夠訪問last_metrics_time_ ,因為它不是原子的(只有一個度量收集器線程,所以沒有問題)。

last_metrics_time_設置為get_metrics本地的靜態變量似乎不正確,因為它將在首次調用get_metrics時初始化,而不是在程序啟動時初始化。 這將導致delta值接近零(因為now將非常接近last_metrics_time_ )並且第一次調用返回了一個巨大的值。

沒有。

但是你可以將這個多責任類分成兩個單一責任類:一個運行循環,更新循環loops_ ,並提供loops_只讀訪問,另一個計算指標並記錄時間。 然后每個函數只能訪問它所需的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM