![](/img/trans.png)
[英]What is the rationale for renaming monotonic_clock to steady_clock in <chrono>?
[英]Is steady_clock monotonic across threads?
是否在線程中保留了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
,因為它是由第一個離開?
標准[time.clock.steady]
...
static constexpr bool is_steady = true;
static time_point now() noexcept;
...
is_steady必須在所有實現中都為true(即,如果OS等不具備,則該類不能與false一起存在),並且兩個成員都獨立於實例。
標准[time.clock.req]:
時鍾要求
...
C1和C2表示時鍾類型。 t1和t2是C1 :: now()返回的值,其中返回t1的調用發生在(1.10)調用返回t2之前,並且這兩個調用都發生在C1 :: time_-point :: max()之前。
...
C1 :: is_steady:如果t1 <= t2始終為真且時鍾滴答之間的時間是常數,則為true,否則為false。
1.10部分包含:
多線程執行和數據競爭
...
評估A發生在評估B之前,如果:
A在B之前排序,或
線程發生在B之前。
...
評估A線程在評估B之前發生
與B 同步 ,或......
我不認為需要在這里復制同步(互斥量應該足以實現),
所以: 是的 ,沒關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.