在线程中,steady_clock是单调的吗?

Gio*_*ani 6 c++ multithreading clock

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;
}
Run Code Online (Sandbox Code Playgroud)

我可以假设最后具有较小time值的线程(假设它们具有不同的值)i在另一个之前被修改并且另一个看到i它被第一个留下了吗?

dev*_*fan 7

标准[time.clock.steady]

...
static constexpr bool is_steady = true;
static time_point now() noexcept;
...  
Run Code Online (Sandbox Code Playgroud)

is_steady必须在所有实现中都为true(即,如果OS等不具备,则该类不能与false一起存在),并且两个成员都独立于实例.

标准[time.clock.req]:

时钟要求
......
C1和C2表示时钟类型.t1和t2是C1 :: now()返回的值,其中返回t1的调用发生在(1.10)调用返回t2之前,并且这两个调用都发生在C1 :: time_-point :: max()之前.
...
C1 :: is_steady:如果t1 <= t2始终为真且时钟滴答之间的时间是常数,则为true,否则为false.

1.10部分包含:

多线程执行和数据竞争
...
评估A发生在评估B之前,如果:
A在B之前排序,或者
A线程在B之前发生
....
评估A线程发生在评估B之前如果
一个同步与B,或...

我不认为同步需要在这里复制(互斥量应该足以实现),
所以:是的,没关系.