【问题标题】:Is steady_clock monotonic across threads?跨线程的 stable_clock 是单调的吗?
【发布时间】:2016-12-02 10:55:26
【问题描述】:

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,因为它是由第一个?

【问题讨论】:

  • 'auto'的意思是把时间放到栈上,函数返回时丢弃吗?
  • @Marichyasana auto 只是指示编译器自动推断类型的简写,这样我就不必键入它。如果你不喜欢它,假设你有steady_clock::time_point 而不是auto。当然变量是自动的,所以在线程结束时被丢弃,但假设我有一些方法来报告它并决定,比较时间戳,哪个线程之前执行。我可以从steady_clock 单调性得到保证吗?
  • 我从来没有见过一个时钟有时会倒转,有时会前进。
  • @Marichyasana 有很多。现在,steady_clock 保证它永远不会这样做,这意味着如果你调用它两次,第一次调用将返回一个不大于第二次的值。但我不明白这种保证是否延伸到不同的线程,这就是我要问的。
  • (对不起,我的意思是夏令时,不是闰年:p 脑子放屁)

标签: c++ multithreading clock


【解决方案1】:

标准 [time.clock.steady]

...
static constexpr bool is_steady = true;
static time_point now() noexcept;
...  

is_steady 在所有实现中都必须为真(即,如果操作系统等不具备此功能,则该类不能以假存在),并且两个成员都独立于实例。

标准[time.clock.req]:

时钟要求
...
C1 和 C2 表示时钟类型。 t1 和 t2 是 C1::now() 返回的值,其中返回 t1 的调用发生在 (1.10) 返回 t2 的调用之前,并且这两个调用都发生在 C1::time_-point::max 之前().
...
C1::is_steady:如果 t1

而1.10部分包含:

多线程执行和数据竞争
...
如果满足以下条件,则评估 A 在评估 B 之前发生:
A 在 B 之前排序,或者
线程间发生在 B 之前。
...
评估 A 线程间发生在评估 B 之前 if
A 同步与 B,或 ...

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

【讨论】:

    猜你喜欢
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2011-06-29
    • 1970-01-01
    相关资源
    最近更新 更多