2016-12-02 66 views
6

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

'自动'意味着把时间放在堆栈上,并在函数返回时丢弃它? – Marichyasana

+0

@Marichyasana'auto'只是指示编译器自动推断类型的简写,所以我不必输入它。假设你有'steady_clock :: time_point'而不是'auto',如果你不喜欢它。当然,这个变量是自动的,所以在线程结束时被丢弃,但是假设我有一些方法来报告并决定,比较时间戳,之前执行的线程。我可以从'steady_clock'单调性得到保证吗? –

+0

我从来没有见过一些时间倒退的时钟,并且有些时候会转发。 – Marichyasana

回答

7

标准[time.clock.steady]

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

is_steady必须在所有实现真(即,类不能与假存在,如果OS等不能够的话) ,并且这两个成员都独立于实例。

标准[time.clock.req]:

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

而1.10部分包含:

多线程执行和数据竞争
...
如果B评价之前进行了评价的情况:
A是B之前测序,或
B之间发生线程间连接。
...
评估线程发生在评估B之前,如果
一个同步与B,或 ...

我不认为同步需要被复制到此处(互斥,应该足以履行),
这样:,没关系。