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.