簡體   English   中英

在線程中,steady_clock是單調的嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM