Параллельное программирование на С++ в действии — страница 45 из 53

 bool quit_pressed = false;


 while (!quit_pressed) {

  char c = getchar();

  switch(с) {

  case '0':

  case '1':

  case '2':

  case '3':

  case '4':

  case '5':

  case '6':

  case '7':

  case '8':

  case '9':

   atmqueue.send(digit_pressed(с));

   break;

  case 'b':

   atmqueue.send(balance_pressed());

   break;

  case 'w':

   atmqueue.send(withdraw_pressed(50));

   break;

  case 'с':

   atmqueue.send(cancel_pressed());

   break;

  case 'q':

   quit_pressed = true;

   break;

  case 'i':

   atmqueue.send(card_inserted("acc1234"));

   break;

  }

 }

 bank.done();

 machine.done();

 interface_hardware.done();

 atm_thread.join();

 bank_thread.join();

 if_thread.join();

}

Приложение DСправочник по библиотеке С++ Thread Library

D.1. Заголовок
<chrono>

В заголовке

объявлены классы для представления моментов времени, интервалов и часов, которые служат источником объектов
time_point
. В каждом классе часов имеется статическая переменная-член
is_steady
, показывающая, являются ли данные часы стабильными. Стабильными называются часы, которые ходят с постоянной частотой и не допускают подведения. Единственные гарантированно стабильные часы представлены классом
std::chrono::steady_clock
.

Содержимое заголовка

namespace std {


namespace chrono {


template>

class duration;


template<

 typename Clock,

 typename Duration = typename Clock::duration>

class time_point;


class system_clock;

class steady_clock;

typedef unspecified-clock-type high_resolution_clock;


}


}

D.1.1. Шаблон класса
std::chrono::duration

Шаблон класса s

td::chrono::duration
предназначен для представления интервалов. Параметры шаблона
Rep
и
Period
— это соответственно тип данных для хранения значения интервала и конкретизация шаблона класса
std::ratio
, которая задает промежуток времени (в виде долей секунды) между последовательными «тиками». Например,
std::chrono::duration
определяет количество миллисекунд, представимое значением типа
int
, s
td::chrono::duration>
 — количество пятидесятых долей секунды, представимое значением типа
short
, а
std::chrono::duration>
 — количество минут, представимое значением типа
long long
.

Определение класса

template >

class duration {

public:

 typedef Rep rep;

 typedef Period period;


 constexpr duration() = default;

 ~duration() = default;


 duration(const duration&) = default;

 duration& operator=(const duration&) = default;


 template 

 constexpr explicit duration(const Rep2& r);


 template 

 constexpr duration(const duration& d);


 constexpr rep count() const;

 constexpr duration operator+() const;

 constexpr duration operator-() const;

 duration& operator++();

 duration operator++(int);

 duration& operator--();

 duration operator--(int);

 duration& operator+=(const duration& d);

 duration& operator-=(const duration& d);

 duration& operator*=(const rep& rhs);

 duration& operator/=(const rep& rhs);

 duration& operator%=(const rep& rhs);

 duration& operator%=(const duration& rhs);

 static constexpr duration zero();

 static constexpr duration min();

 static constexpr duration max();

};


template 

constexpr bool operator==(

 const duration& lhs,

 const duration& rhs);


template 

constexpr bool operator !=(

 const duration& lhs,

 const duration& rhs);


template 

constexpr bool operator<(

 const duration& lhs,

 const duration& rhs);


template 

constexpr bool operator<=(

 const duration& lhs,

const duration& rhs);


template 

constexpr bool operator>(

 const duration& lhs,

 const duration& rhs);


template 

constexpr bool operator>=(

 const duration& lhs,

 const duration& rhs);


template 

constexpr ToDuration duration_cast(

 const duration& d);

Требования

Rep
должен быть встроенным числовым типом или определенным пользователем типом со свойствами числа.
Period
должен быть конкретизацией шаблона
std::ratio<>
.

STD::CHRONO::DURATION::REP, TYPEDEF

Это псевдоним типа для хранения числа тиков в значении

duration
.

Объявление

typedef Rep rep;

rep
— тип значения, используемого для хранения внутреннего представления объекта
duration
.

STD::CHRONO::DURATION::PERIOD, TYPEDEF

Это псевдоним типа для конкретизации шаблона класса

std::ratio
, которая задает количество долей секунды, представляемых счетчиком интервала. Например, если
period
— это
std::ratio<1, 50>
, то объект
duration
, для которого
count()
равно N, представляет N пятидесятых долей секунды.

Объявление

typedef Period period;

STD::CHRONO::DURATION
, КОНСТРУКТОР ПО УМОЛЧАНИЮ

Конструирует экземпляр

std::chrono::duration
со значением по умолчанию.

Объявление

constexpr duration() = default;

Результат

Внутреннее значение

duration
(типа
rep
) инициализируется значением по умолчанию.

STD::CHRONO::DURATION
, КОНВЕРТИРУЮЩИЙ КОНСТРУКТОР ИЗ ЗНАЧЕНИЯ СЧЕТЧИКА

Конструирует экземпляр

std::chrono::duration
с заданным значением счетчика.

Объявление

template 

constexpr explicit duration(const Rep2& r);

Результат

Внутреннее значение объекта

duration
инициализируется значением
static_cast(r)
.

Требования

Этот конструктор участвует в разрешении перегрузки, только если

Rep2
может быть неявно преобразован в
Rep
, и либо
Rep
— тип с плавающей точкой, либо
Rep2
не является типом с плавающей точкой.

Постусловие

this->count() == static_cast(r)

STD::CHRONO::DURATION
, КОНВЕРТИРУЮЩИЙ КОНСТРУКТОР ИЗ ДРУГОГО ЗНАЧЕНИЯ
STD::CHRONO::DURATION

Конструирует экземпляр

std::chrono::duration
, масштабируя значение счетчика другого объекта
std::chrono::duration
.

Объявление

template 

constexpr duration(const duration& d);

Результат

Внутреннее значение объекта

duration
инициализируется значением
duration_cast>(d).count()
.

Требования

Этот конструктор участвует в разрешении перегрузки, только если

Rep
— тип с плавающей точкой, либо
Rep2
не является типом с плавающей точкой, и
Period2
— целое кратное
Period
(то есть
ratio_divide::den == 1
). Это позволяет избежать случайного обрезания (и, значит, потери точности) при сохранении интервала с меньшим периодом в переменной, представляющий интервал с большим периодом.

Постусловие

this->count() == duration_cast>(d).count()

Примеры

duration< int, ratio<1, 1000>> ms(5); ←
5 миллисекунд

duration> s(ms);←┐
Ошибка: нельзя

сохранить мс как

целые секунды

duration> s2(ms);←┐
Правильно:

s2.count() == 0.005

duration> us(ms);←┐
Правильно:

us.count() == 5000

STD::CHRONO::DURATION::COUNT
, ФУНКЦИЯ-ЧЛЕН

Получает значение интервала.

Объявление

constexpr rep count() const;

Возвращаемое значение

Внутреннее значение объекта

duration
в виде значения типа
rep
.

STD::CHRONO::DURATION::OPERATOR+
, УНАРНЫЙ ОПЕРАТОР ПЛЮС

Пустая операция, возвращает копию

*this
.

Объявление

constexpr duration operator+() const;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR-
, УНАРНЫЙ ОПЕРАТОР МИНУС

Возвращает интервал, в котором значение

count()
противоположно значению
this->count()
.

Объявление

constexpr duration operator-() const;

Возвращаемое значение

duration(-this->count());

STD::CHRONO::DURATION::OPERATOR++
, ОПЕРАТОР ПРЕДИНКРЕМЕНТА

Инкрементирует внутренний счетчик.

Объявление

duration& operator++();

Результат

++this->internal_count;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR++
, ОПЕРАТОР ПОСТИНКРЕМЕНТА

Инкрементирует внутренний счетчик и возвращает то значение

*this
, которое предшествовало выполнению операции.

Объявление

duration operator++(int);

Результат

duration temp(*this);

++(*this);

return temp;

STD::CHRONO::DURATION::OPERATOR--
, ОПЕРАТОР ПРЕДЕКРЕМЕНТА

Декрементирует внутренний счетчик.

Объявление

duration& operator--();

Результат

--this->internal_count;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR--
, ОПЕРАТОР ПОСТДЕКРЕМЕНТА

Декрементирует внутренний счетчик и возвращает то значение

*this
, которое предшествовало выполнению операции.

Объявление

duration operator--(int);

Результат

duration temp(*this);

--(*this);

return temp;

STD::CHRONO::DURATION::OPERATOR+=
, СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Прибавляет счетчик другого объекта

duration
к внутреннему счетчику
*this
.

Объявление

duration& operator+=(duration const& other);

Результат

internal_count += other.count();

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR-=
, СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Вычитает счетчик другого объекта

duration
из внутреннего счетчика
*this
.

Объявление

duration& operator-=(duration const& other);

Результат

internal_count-=other.count();

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR*=
, СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Умножает внутренний счетчик

*this
на заданное значение.

Объявление

duration& operator*=(rep const& rhs);

Результат

internal_count*=rhs;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR/=
, СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Делит внутренний счетчик

*this
на заданное значение.

Объявление

duration& operator/=(rep const& rhs);

Результат

internal_count/=rhs;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR%=
, СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Записывает во внутренний счетчик

*this
остаток от его деления на заданное значение.

Объявление

duration& operator%=(rep const& rhs);

Результат

internal_count%=rhs;

Возвращаемое значение

*this

STD::CHRONO::DURATION::OPERATOR%=
, СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Записывает во внутренний счетчик

*this
остаток от его деления на счетчик в другом объекте
duration
.

Объявление

duration& operator%=(duration const& rhs);

Результат

internal_count %= rhs.count();

Возвращаемое значение

*this

STD::CHRONO::DURATION::ZERO
, СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Возвращает объект

duration
, представляющий значение нуль.

Объявление

constexpr duration zero();

Возвращаемое значение

duration(duration_values::zero());

STD::CHRONO::DURATION::MIN
, СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Возвращает объект

duration
, представляющий минимально возможное для данной конкретизации значение.

Объявление

constexpr duration min();

Возвращаемое значение

duration(duration_values::min());

STD::CHRONO::DURATION::MAX
, СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Возвращает объект

duration
, представляющий максимально возможное для данной конкретизации значение.

Объявление

constexpr duration max();

Возвращаемое значение

duration(duration_values::max());

STD::CHRONO::DURATION
, ОПЕРАТОР СРАВНЕНИЯ НА РАВЕНСТВО

Сравнивает два объекта

duration
на равенство, даже если они имеют разные представления и (или) периоды.

Объявление

template 

constexpr bool operator==(

 const duration& lhs,

 const duration& rhs);

Требования

Либо для

lhs
определено неявное преобразование в
rhs
, либо наоборот. Если ни одна из частей не может быть неявно преобразована в другую или они являются различными представлениями
duration
, но каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Результат

Если

CommonDuration
— синоним
std::common_type, duration>::type
, to
lhs==rhs
возвращает
CommonDuration(lhs).count() == CommonDuration(rhs).count()
.

STD::CHRONO::DURATION
, ОПЕРАТОР СРАВНЕНИЯ НА НЕРАВЕНСТВО

Сравнивает два объекта

duration
на неравенство, даже если они имеют разные представления и (или) периоды.

Объявление

template 

constexpr bool operator!=(

 const duration& lhs,

 const duration& rhs);

Требования

Либо для

lhs
определено неявное преобразование в
rhs
, либо наоборот. Если ни одна из частей не может быть неявно преобразовала в другую или они являются различными представлениями
duration
, но каждая может быть неявно преобразовала в другую, то выражение построено некорректно.

Возвращаемое значение

!(lhs == rhs)

STD::CHRONO::DURATION
, ОПЕРАТОР СРАВНЕНИЯ МЕНЬШЕ

Проверяет, что один объект

duration
меньше другого, даже если они имеют разные представления и (или) периоды.

Объявление

template 

constexpr bool operator<(

 const duration& lhs,

 const duration& rhs);

Требования

Либо для

lhs
определено неявное преобразование в
rhs
, либо наоборот. Если ни одна из частей не может быть неявно преобразована в другую или они являются различными представлениями
duration
, по каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Результат

Если

CommonDuration
— синоним
std::common_type< duration< Rep1, Period1>, duration< Rep2, Period2>>::type
, то
lhs
возвращает
CommonDuration(lhs).count() < CommonDuration(rhs).count()
.

STD::CHRONO::DURATION
, ОПЕРАТОР СРАВНЕНИЯ БОЛЬШЕ

Проверяет, что один объект

duration
больше другого, даже если они имеют разные представления и (или) периоды.

Объявление

template 

constexpr bool operator>(

 const duration& lhs,

 const duration& rhs);

Требования

Либо для

lhs
определено неявное преобразование в
rhs
, либо наоборот. Если ни одна из частей не может быть неявно преобразована в другую или они являются различными представлениями
duration
, но каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Возвращаемое значение

!((rhs

STD::CHRONO::DURATION
, ОПЕРАТОР СРАВНЕНИЯ МЕНЬШЕ ИЛИ РАВНО

Проверяет, что один объект

duration
меньше или равен другому, даже если они имеют разные представления и (или) периоды.

Объявление

template 

constexpr bool operator<=(

 const duration& lhs,

 const duration& rhs);

Требования

Либо для

lhs
определено неявное преобразование в
rhs
, либо наоборот. Если ни одна из частей не может быть неявно преобразовала в другую или они являются различными представлениями
duration
, но каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Возвращаемое значение

!(rhs>lhs)

STD::CHRONO::DURATION
, ОПЕРАТОР СРАВНЕНИЯ БОЛЬШЕ ИЛИ РАВНО

Проверяет, что один объект

duration
больше или равен другому, даже если они имеют разные представления и (или) периоды.

Объявление

template 

constexpr bool operator>=(

 const duration& lhs,

 const duration& rhs);

Требования

Либо для

lhs
определено неявное преобразование в
rhs
, либо наоборот. Если ни одна из частей не может быть неявно преобразована в другую или они являются различными представлениями
duration
, но каждая может быть неявно преобразована в другую, то выражение построено некорректно.

Возвращаемое значение

!(lhs

STD::CHRONO::DURATION_CAST
, ФУНКЦИЯ, HE ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Явно преобразует объект

std::chrono::duration
в заданную конкретизацию
std::chrono::duration
.

Объявление

template 

constexpr ToDuration duration_cast(

 const duration& d);

Требования

ToDuration
должен быть конкретизацией
std::chrono::duration
.

Возвращаемое значение

Значение

d
, преобразованное к типу интервала, заданного параметром
ToDuration
. При выполнении операции минимизируется потеря точности в результате преобразования интервалов с разными масштабами и типами представления.

D.1.2. Шаблон класса
std::chrono::time_point

Шаблон класса

std::chrono::time_point
представляет момент времени, измеренный по конкретным часам. Задается в виде интервала, прошедшего с момента эпохи данных часов. Параметр шаблона
Clock
задает часы (у разных часов должны быть разные типы), а параметр
Duration
— тип для измерения интервала от эпохи, который должен быть конкретизацией шаблона
std::chrono::duration
. По умолчанию
Duration
совпадает с подразумеваемым типом интервала, определенным в
Clock
.

Определение класса

template 

class time_point {

public:

 typedef Clock clock;

 typedef Duration duration;

 typedef typename duration::rep rep;

 typedef typename duration::period period;


 time_point();

 explicit time_point(const duration& d);


 template 

 time_point(const time_point& t);


 duration time_since_epoch() const;


 time_point& operator+=(const duration& d);

 time_point& operator-=(const duration& d);


 static constexpr time_point min();

 static constexpr time_point max();

};

STD::CHRONO::TIME_POINT
, КОНСТРУКТОР ПО УМОЛЧАНИЮ

Конструирует объект

time_point
, представляющий эпоху часов
Clock
; внутренний интервал инициализируется значением
Duration::zero()
.

Объявление

time_point();

Постусловие

Для сконструированного по умолчанию объекта

tp
типа
time_point
имеет место равенство
tp.time_since_epoch() == tp::duration::zero()
.

STD::CHRONO::TIME_POINT
, КОНСТРУКТОР ИЗ ИНТЕРВАЛА

Конструирует объект

time_point
, представляющий заданный интервал от эпохи часов
Clock
.

Объявление

explicit time_point(const duration& d);

Постусловие

Для объекта

tp
типа
time_point
, созданного конструктором
tp(d)
из некоторого интервала
d
, имеет место равенство
tp.time_since_epoch() == d
.

STD::CHRONO::TIME_POINT
, КОНВЕРТИРУЮЩИЙ КОНСТРУКТОР

Конструирует объект

time_point
из другого объекта
time_point
с таким же типом
Clock
, по другим типом
Duration
.

Объявление

template 

time_point(const time_point& t);

Требования

Для типа

Duration2
должно существовать неявное преобразование в тип
Duration
.

Результат

Эквивалентно выражению

time_point(t.time_since_epoch())
.

Значение, возвращенное функцией

t.time_since_epoch()
неявно преобразуется в объект типа
Duration
, который сохраняется в новом объекте типа
time_point
.

STD::CHRONO::TIME_POINT::TIME_SINCE_EPOCH
, ФУНКЦИЯ-ЧЛЕН

Возвращает интервал от эпохи часов для данного объекта типа

time_point
.

Объявление

duration time_since_epoch() const;

Возвращаемое значение

Значение

duration
, хранящееся в
*this
.

STD::CHRONO::TIME_POINT::OPERATOR+=
, СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Прибавляет указанный интервал

duration
к значению, хранящемуся в данном объекте
time_point
.

Объявление

time_point& operator+=(const duration& d);

Результат

Прибавляет

d
к внутреннему интервалу
*this
, эквивалентно
this->internal_duration += d
.

Возвращаемое значение

*this

STD::CHRONO::TIME_POINT::OPERATOR-=
, СОСТАВНОЙ ОПЕРАТОР ПРИСВАИВАНИЯ

Вычитает указанный интерфейс

duration
из значения, хранящегося в данном объекте
time_point
.

Объявление

time_point& operator-=(const duration& d);

Результат

Вычитает

d
из внутреннего интервала
*this
, эквивалентно
this->internal_duration -= d
.

Возвращаемое значение

*this

STD::CHRONO::TIME_POINT::MIN
, СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Получает объект

time_point
, представляющий минимально возможное для данного типа значение.

Объявление

static constexpr time_point min();

Возвращаемое значение

time_point(time_point::duration::min())
(см. 11.1.1.15)

STD::CHRONO::TIME_POINT::MAX,
СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Получает объект

time_point
, представляющий максимально возможное для данного типа значение.

Объявление

static constexpr time_point max();

Возвращаемое значение

time_point(time_point::duration::max())
(см. 11.1.1.16)

D.1.3. Класс
std::chrono::system_clock

Класс

std::chrono::system_clock
предоставляет средства для получения времени от системных часов реального времени. Текущее время возвращает функция
std::chrono::system_clock::now()
. Объекты класса
std::chrono::system_clock::time_point
можно преобразовывать в тип
time_t
с помощью функции
std::chrono::system_clock::to_time_t()
и получать из этого типа с помощью функции
std::chrono::system_clock::to_time_point()
. Системные часы не стабильны, поэтому последующее обращение к
std::chrono::system_clock::now()
может вернуть момент времени, более ранний, чем при предыдущем обращении (например, если часы операционной системы были подведены вручную или автоматически синхронизировались с внешним источником времени).

Определение класса

class system_clock {


public:

 typedef unspecified-integral-type rep;

 typedef std::ratio<unspecified, unspecified> period;

 typedef std::chrono::duration duration;

 typedef std::chrono::time_point time_point;

 static const bool is_steady = unspecified;


 static time_point now() noexcept;


 static time_t to_time_t(const time_point& t) noexcept;

 static time_point from_time_t(time_t t) noexcept;

};

STD::CHRONO::SYSTEM_CLOCK::REP
, TYPEDEF

Псевдоним целочисленного типа, используемого для хранения количества тиков в интервале

duration
.

Объявление

typedef unspecified-integral-type rep;

STD::CHRONO::SYSTEM_CLOCK::PERIOD
, TYPEDEF

Псевдоним типа для конкретизации шаблонного класса

std::ratio
, которая определяет наименьшее число секунд (или долей секунды) между различающимися значениями
duration
или
time_point
. Псевдоним
period
определяет точность часов, а не частоту тактов.

Объявление

typedef std::ratio<unspecified, unspecified> period;

STD::CHRONO::SYSTEM_CLOCK::DURATION
, TYPEDEF

Конкретизация шаблонного класса

std::chrono::duration
, в которой может храниться разность между любыми двумя моментами времени, полученными от системных часов реального времени.

Объявление

typedef std::chrono::duration<

 std::chrono::system_clock::rep,

 std::chrono::system_clock::period> duration;

STD::CHRONO::SYSTEM_CLOCK::TIME_POINT
, TYPEDEF

Конкретизация шаблонного класса

std::chrono::time_point
, в которой могут храниться моменты времени, полученные от системных часов реального времени.

Объявление

typedef std::chrono::time_point time_point;

STD::CHRONO::SYSTEM_CLOCK::NOW
, СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Получает текущее время от системных часов реального времени.

Объявление

time_point now() noexcept;

Возвращаемое значение

Экземпляр

time_point
, представляющий текущее время по системным часам реального времени.

Исключения

Возбуждает исключение

std::system_error
в случае ошибки.

STD::CHRONO::SYSTEM_CLOCK::TO_TIME_T
, СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Преобразует объект типа

time_point
в объект типа
time_t
.

Объявление

time_t to_time_t(time_point const& t) noexcept;

Возвращаемое значение

Экземпляр

time_t
, представляющий тот же момент времени, что и
t
, округленный или обрезанный до секунд.

Исключения

Возбуждает исключение

std::system_error
в случае ошибки.

STD::CHRONO::SYSТЕМ_CLOCK::FROM_TIME_T
, СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Преобразует объект типа

time_t
в объект типа
time_point
.

Объявление

time_point from_time_t(time_t const& t) noexcept;

Возвращаемое значение

Экземпляр

time_point
, представляющий тот же момент времени, что и
t
.

Исключения

Возбуждает исключение

std::system_error
в случае ошибки.

D.1.4. Класс
std::chrono::steady_clock

Класс

std::chrono::steady_clock
предоставляет доступ к системным стабильным часам. Текущее время возвращает функция
std::chrono::steady_clock::now()
. He существует фиксированного соотношения между значениями, возвращаемыми
std::chrono::steady_clock::now()
и показаниями часов реального времени. Стабильные часы не могут «идти в обратную сторону», поэтому если некое обращение к функции
std::chrono::steady_clock::now()
происходит-раньше другого обращения к ней же, то второе обращение должно вернуть момент времени, больший или равным первому. Часы ходят с частотой, настолько близкой к постоянной, насколько это возможно.

Определение класса

class steady_clock {

public:

 typedef unspecified-integral-type rep;

 typedef std::ratio<

  unspecified, unspecified> period;

 typedef std::chrono::duration duration;

 typedef std::chrono::time_point

 time_point;

 static const bool is_steady = true;


 static time_point now() noexcept;

};

STD::CHRONO::STEADY_CLOCK::REP
, TYPEDEF

Псевдоним целочисленного типа, используемого для хранения количества тиков в интервале

duration
.

Объявление

typedef unspecified-integral-type rep;

STD::CHRONO::STEADY_CLOCK::PERIOD
, TYPEDEF

Псевдоним типа для конкретизации шаблонного класса

std::ratio
, которая определяет наименьшее число секунд (или долей секунды) между различающимися значениями
duration
или
time_point
. Псевдоним
period
определяет точность часов, а не частоту тактов.

Объявление

typedef std::ratio<unspecified, unspecified> period;

STD::CHRONO::STEADY_CLOCK::DURATION
, TYPEDEF

Конкретизация шаблонного класса

std::chrono::duration
, в которой может храниться разность между любыми двумя моментами времени, полученными от системных стабильных часов.

Объявление

typedef std::chrono::duration<

 std::chrono::steady_clock::rep,

 std::chrono::steady_clock::period> duration;

STD::CHRONO::STEADY_CLOCK::TIME_POINT
, TYPEDEF

Конкретизация шаблонного класса

std::chrono::time_point
, в которой могут храниться моменты времени, полученные от системных стабильных часов.

Объявление

typedef std::chrono::time_point

time_point;

STD::CHRONO::STEADY_CLOCK::NOW
, СТАТИЧЕСКАЯ ФУНКЦИЯ-ЧЛЕН

Получает текущее время от системных стабильных часов.

Объявление

time_point now() noexcept;

Возвращаемое значение

Экземпляр

time_point
, представляющий текущее время но системным стабильным часам.

Исключения

Возбуждает исключение

std::system_error
в случае ошибки.

Синхронизация

Если одно обращение к

std::chrono::steady_clock::now()
происходит-раньше другого, то момент времени
time_point
, возвращенный при первом обращении, меньше или равен моменту времени
time_point
, возвращенному при втором обращении.

D.1.5. Псевдоним типа
std::chrono::high_resolution_clock

Класс

std::chrono::high_resolution_clock
предоставляет доступ к системным часам максимально высокого разрешения. Как и для всех остальных часов, текущее время можно получить от функции
std::chrono::high_resolution_clock::now()
. Имя
std::chrono::high_resolution_clock
может быть псевдонимом класса
std::chrono::system_clock
или класса
std::chrono::steady_clock
, либо отдельным типом.

Хотя тип

std::chrono::high_resolution_clock
дает самое высокое разрешение среди всех входящих в библиотеку часов, обращение к функции
std::chrono::high_resolution_clock::now()
все же занимает конечное время. Поэтому, пытаясь хронометрировать очень короткие операции, учитывайте накладные расходы на вызов этой функции.

Определение класса

class high_resolution_clock {

public:

 typedef unspecified-integral-type rep;

 typedef std::ratio<

  unspecified, unspecified> period;

 typedef std::chrono::duration duration;

 typedef std::chrono::time_point<

  unspecified> time_point;

 static const bool is_steady = unspecified;


 static time_point now() noexcept;

};

D.2. Заголовок