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,或 ...

我不認爲同步需要被複制到此處(互斥,應該足以履行),
這樣:,沒關係。