Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以限制成员函数访问成员变量?_C++_Multithreading_Thread Safety_Chrono_Stdatomic - Fatal编程技术网

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

C++ 是否可以限制成员函数访问成员变量?,c++,multithreading,thread-safety,chrono,stdatomic,C++,Multithreading,Thread Safety,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

我有一个与此类似的线程类:

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
};
class-thr{
无效运行(){
对于(;;){
//阻塞队列
//做一些处理
++环路(uu),;
}
}
无效获取度量(int和qps){
std::chrono::staddy_clock::time_point now=std::chrono::staddy_clock::now();
double delta=std::chrono::duration(现在-最后一个度量值\时间)。count();
qps=标准::圆形(环/三角形);
循环=0;
最后的度量值时间=现在;
}
静态std::原子循环;
静态标准::时钟::稳定时钟::时间\u点最后\u度量\u时间\u;
};
std::atomic thr::loops_{0};
标准::时钟::稳定时钟::时间点thr::最后一个度量值\u时间\u{
std::chrono::staid_clock::now()//初始值:程序启动时
};
有许多这样的实例正在运行。还有另一个线程会不时调用get_metrics()

我想阻止
run()
访问
last\u metrics\u time\u
,因为它不是原子的(只有一个metrics收集器线程,所以没有问题)

last\u metrics\u time
设置为
get\u metrics
的本地静态变量似乎不正确,因为它将在首次调用
get\u metrics
时初始化,而不是在程序启动时初始化。这将导致
delta
的值接近于零(因为
now
将非常接近
last\u metrics\u time\u
),并且第一次调用返回的值非常大。


但是您可以将这个多责任类划分为两个单一责任类:一个运行循环,更新
循环,并提供对它的只读访问,另一个计算度量并记录时间。然后每个函数只能访问它所需的内容。

谢谢你的评论,我把它设置为非静态的,但后来意识到这是胡说八道,因为OP肯定希望它是静态的+1.