繁体   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