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

时间:2016-12-02 10:55:27

标签: 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;
}

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

1 个答案:

答案 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同步,或   ......

我不认为需要在此处复制同步(互斥量应该足以实现), 所以:,没关系。