std::chrono::steady_clock
的单调属性是否跨线程保留?例如,假设我有以下程序。
#include <chrono>
#include <mutex>
#include <thread>
using namespace std;
using namespace chrono;
mutex m;
int i = 0;
void do_something(int &x) {
x += 1;
}
void f1() {
unique_lock<mutex> lock(m);
auto time = steady_clock::now();
do_something(i);
}
void f2() {
unique_lock<mutex> lock(m);
auto time = steady_clock::now();
do_something(i);
}
int main() {
thread t1(f1);
thread t2(f2);
t1.join();
t2.join();
return 0;
}
我可以假设最后具有较小time
值的线程(假设它们具有不同的值)在另一个之前修改i
并且另一个看到i
因为它是由第一个留下的?
答案 0 :(得分:7)
标准[time.clock.steady]
...
static constexpr bool is_steady = true;
static time_point now() noexcept;
...
is_steady必须在所有实现中都为true(即,如果操作系统等不具备,则该类不能存在false,并且两个成员都独立于实例。
标准[time.clock.req]:
时钟要求
...
C1和C2表示时钟类型。 t1和t2是C1 :: now()返回的值,其中返回t1的调用发生在(1.10)之前,调用返回t2,并且这两个调用都发生在C1 :: time_-point :: max之前()。
...
C1 :: is_steady:如果t1&lt; = t2始终为真且时钟周期之间的时间是常数,则为true,否则为false。
1.10部分包含:
多线程执行和数据竞赛
...
评估A发生在评估B之前,如果:
A在B或B1之前排序 线程发生在B.
之前 ...
如果是,则在评估B之前发生评估A线程 与B同步,或 ......
我不认为需要在此处复制同步(互斥量应该足以实现), 所以:是,没关系。