2017-10-14 14 views
1

std::chrono::system_clock::now().time_since_epoch()은 어디에서 왔습니까? 즉 수정 발진기 (물리적 구성 요소)와의 직접 인터페이스입니까?`std :: chrono :: system_clock :: now(). time_since_epoch()`의 시간은 어디에서 왔으며 여러 스레드에서 액세스 할 경우 차단할 수 있습니까?

수정 발진기 인 경우 코어 당 하나입니까, 아니면 모든 코어에 하나입니까?

모든 코어에 대해 하나의 발진기가있는 경우 여러 스레드가 정확히 동일한 시간 (대기 시간이 짧은 환경)에 액세스하면 스레드를 차단할 수 있습니까?

각 코어에 크리스털 발진기가있는 경우 어떻게 동기화됩니까?

+0

특정 구현을 염두에두고 있습니까? – chris

+0

@chris 무슨 뜻인지 자세히 설명해 주시겠습니까? x86 대 팔 또는 코드 구현과 같은 구현을 의미합니까? – Greg

+0

가장 주목할만한 것은 OS이기 때문에 크로노 라이브러리가 OS 호출에 위임하여 그 시점으로부터 시스템 시간을 얻는 것이 가능하기 때문입니다. 예를 들어 Windows에는'GetSystemTime'이 있습니다. 이 표준은 어떤 종류의 시스템이 그것을 구현할 수 있는지를 제한하기 때문에 세부 사항에 대해서는 거의 직접적으로 적용되지 않습니다. – chris

답변

2

C++ 표준은 system_clock::now()이 구현되는 방법에 대해 신경 쓰지 않습니다. 단지 지정합니다

현재 시점을 나타내는 time_point 개체를 반환합니다.

일반적인 C++ 표준 라이브러리 구현은 기본 OS 시스템 호출을 사용하여 time_point 객체를 생성하기위한 동작 시스템 클록 값을 얻습니다.

하드웨어 구현시 하드웨어 아키텍처를 고려해야합니다. 그러나 일반적으로 시스템 클록의 유지 보수 비용은 얼마나 많은 프로세스/스레드가 그것을 읽었는지에 관계없이 항상 존재합니다. 그리고 시스템 클럭 획득은 스레드 블록을 초래하지 않으며 다중 스레드 프로그램에서 성능 병목 현상을 일으키지 않는 경량 루틴으로 구현됩니다.

게다가, std::chrono::system_clock::now().time_since_epoch() 만은 C++ 구조체 복사를 포함 std::chrono::system_clock::now()에 의해 반환 된 time_point 객체 내부에 포함 된 duration 객체를 반환하는 간단한 관찰자 방법이다.

0

표준 지정 std::chrono::system_clock 다음과 같이

23.17.7.1 클래스 system_clock [time.clock.system] 클래스 system_clock의

객체는 시스템 전체에서 실시간 시계 벽시계 시간을 나타낸다.

이것은 여러 가지 의미가 있습니다. 첫째,이 시계의 시간은 std::chrono::system_clock::to_time_tstd::chrono::system_clock::from_time_t을 통해 time_t 시간으로 변환 할 수 있습니다. 시계는 일종의 물리적 시간을 나타냅니다. 둘째, 시계는 "시스템 전체"로 지정됩니다. 즉, 모든 프로세스가이 시계에서 동일한 time_point 값을 검색해야합니다.

실제로이 시계는 예를 들어 작업 표시 줄에서 볼 수 있듯이 일종의 시간을 검색하는 OS 특정 기능에 대한 호출로 구현되는 경우가 많음을 의미합니다.

이 시계가 is_steady 인 경우 지정되지 않았습니다. 즉,이 시계의 timepoints은 항상 앞으로 나아갈 필요가 없습니다. 실제 시간대에 통화가 발생하더라도 이전 시간대를 얻을 수 있습니다. 예를 들어 사용자가 일부 OS 설정을 통해 시계를 조정 한 경우 이러한 현상이 발생할 수 있습니다.

당신은 무엇을 묘사하는 것에 가까운 것은 std::chrono::steady_clock입니다 :

23.17.7.2 클래스 [time.clock.steady] 클래스 steady_clock의

객체는 결코 감소하지 않습니다에 대한 시계 time_point의 값 대표 steady_clock 실제 시간이 진행되고 time_point의 값이 실시간에 비례하여 일정한 속도로 증가함에 따라.

언급 한 두 가지 요구 사항이 있습니다. 첫째, 시계는 단조 로워 야하므로 시간은 절대로 "뒤로 돌릴 수 없다". 둘째, 시계가 안정적이므로이 시계의 모든 진드기는 동일한 양의 실제 시간을 가져야합니다.

주기 카운터와 같은 하드웨어 카운터로이 시계를 구현하는 것이 자연 스럽습니다. 그러나 조심하십시오 :이 시계는 시스템 전체가 될 필요는 없습니다. 이것은 값이며, 예를 들어. 다른 카운터가있는 다른 CPU가 있더라도 현재 실행중인 CPU에서 가져올 수 있습니다.