Bul*_*net 2 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
};
Run Code Online (Sandbox Code Playgroud)
这种运行有很多例子.还有另一个线程不时调用get_metrics().
我想阻止run()能够访问last_metrics_time_,因为它不是原子的(只有一个度量收集器线程,所以没有问题).
将last_metrics_time_静态变量设置为局部get_metrics似乎不正确,因为它将在get_metrics首次调用时初始化,而不是在程序启动时初始化.这将导致接近零的值delta(因为now将非常接近last_metrics_time_)并且为第一次调用返回一个巨大的值.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |