c++ - 是否可以限制成员函数访问成员变量?

标签 c++ multithreading thread-safety c++-chrono stdatomic

我有一个类似这样的线程类:

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_ 并提供对它的只读访问,另一个计算指标并记录时间。然后每个函数将只能访问它需要的内容。

关于c++ - 是否可以限制成员函数访问成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30239812/

相关文章:

c++ - 我的 for 循环有更好更短的方法吗?

c++ - graphics.h 在 Windows 7 64 位中无法使用 MinGW 的代码块

c# - 卡在异步方法

Java 线程安全 : enum and static methods

java - 如何使公共(public)静态非同步 getInstance() 方法将私有(private)静态引用变量的多个实例返回给对象?

c++ - Cuda Thrust内存管理

c++ - 是否可以在 C++ 中匹配递归整数模板参数?

java - 同步对类字段的访问

java - Java ForkJoinPool 中的某些线程偶尔会空闲

java - 在Java中,如果我调用一个从另一个可运行对象扩展Thread的类,哪个Thread会执行?