2016-12-02 4 views
6

Sind monotone Eigenschaften von std::chrono::steady_clock über Gewinde erhalten? Angenommen, ich habe das folgende Programm.Ist steady_clock monoton über Threads?

#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; 
} 

Kann ich davon ausgehen, dass der Thread, den den kleineren time Wert am Ende hat (unter der Annahme sie überhaupt anderen Wert hat) geändert i vor dem anderen, und dass die anderen Säge i, wie es durch die ersten links wurde ?

+0

Bedeutet 'automatisch', die Zeit auf den Stapel zu legen und zu verwerfen, wenn die Funktion zurückkehrt? – Marichyasana

+0

@Marichyasana 'auto' ist nur eine Kurzform, um den Compiler anzuweisen, den Typ automatisch abzuleiten, so dass ich ihn nicht eingeben muss. Angenommen, Sie haben 'steady_clock :: time_point' anstelle von' auto', wenn Sie es nicht mögen. Natürlich ist die Variable automatisch und wird daher am Ende des Threads verworfen, aber angenommen, ich habe eine Möglichkeit, sie zu melden und zu entscheiden, indem ich die Zeitstempel vergleiche, welchen Thread zuvor ausgeführt wurde. Kann ich von der Monotonie "steady_clock" garantieren? –

+0

Ich habe noch nie eine Uhr gesehen, die einige Zeit rückwärts läuft und einige Zeit weiterläuft. – Marichyasana

Antwort

7

Standard [time.clock.steady]

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

is_steady in allen Implementierungen um wahr zu sein hat (dh. Die Klasse kann nicht mit falschem existieren, wenn das Betriebssystem usw. nicht in der Lage ist) und beide Mitglieder sind unabhängig von Instanzen.

Standard [time.clock.req]:

Clock Anforderungen
...
C1 und C2 Taktarten bezeichnen. t1 und t2 sind Werte, die von C1 :: now() zurückgegeben werden, wobei der Ruf, der t1 zurückgibt, vor (1.10) der Aufruf, der t2 zurückgibt und beide Aufrufe vor C1 :: time_-point :: max() auftreten.
...
C1 :: is_steady: true, wenn t1 < = t2 ist immer wahr und die Zeit zwischen den Taktimpulsen ist konstant, sonst falsch.

Und der 1,10 Teil enthält:

Multi-Threaded-Ausführungen und Daten Rennen
...
Eine Auswertung A vor einer Bewertung B passiert, wenn:
A vor B sequenziert wird, oder
Ein Zwischen-Thread passiert vor B.
...
Eine Auswertung Ein Inter-Thread passiert vor einer Auswertung B if
A synchronisiert mit B oder ...

Ich glaube nicht, Bedürfnisse zu synchronisieren hier kopiert werden (ein Mutex, dass genug sein, um zu erfüllen soll),
so: Ja, Es ist in Ordnung.

Verwandte Themen