Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - [167]

Шрифт
Интервал

>                 << std::endl;

>       std::cout << "Cancel? (c) " << std::endl;

>      }

>     }

>    ).handle(

>     [&](display_withdrawal_cancelled const& msg) {

>      {

>       std::lock_guard lk(iom);

>       std::cout << "Withdrawal cancelled"

>                 << std::endl;

>      }

>     }

>    ).handle(

>     [&](display_pin_incorrect_message const& msg) {

>      {

>       std::lock_guard lk(iom);

>       std::cout << "PIN incorrect" << std::endl;

>      }

>     }

>    ).handle(

>     [&](eject_card const& msg) {

>      {

>       std::lock_guard lk(iom);

>       std::cout << "Ejecting card" << std::endl;

>      }

>     }

>    );

>   }

>  } catch (messaging::close_queue&) {

>  }

> }


> messaging::sender get_sender() {

>  return incoming;

> }

>};


Листинг С.10. Управляющая программа

>int main() {

> bank_machine bank;

> interface_machine interface_hardware;


> atm machine(bank.get_sender(), interface_hardware.get_sender());


> std::thread bank_thread(&bank_machine::run, &bank);

> std::thread if_thread(&interface_machine::run,

>  &interface_hardware);

> std::thread atm_thread(&atm::run, &machine);


> messaging::sender atmqueue(machine.get_sender());

> 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


Еще от автора Энтони Д Уильямс
Викиномика. Как массовое сотрудничество изменяет всё

Это знаменитый бестселлер, который научит вас использовать власть массового сотрудничества и покажет, как применять викиномику в вашем бизнесе. Переведенная более чем на двадцать языков и неоднократно номинированная на звание лучшей бизнес-книги, "Викиномика" стала обязательным чтением для деловых людей во всем мире. Она разъясняет, как массовое сотрудничество происходит не только на сайтах Wikipedia и YouTube, но и в традиционных компаниях, использующих технологии для того, чтобы вдохнуть новую жизнь в свои предприятия.Дон Тапскотт и Энтони Уильямс раскрывают принципы викиномики и рассказывают потрясающие истории о том, как массы людей (как за деньги, так и добровольно) создают новости, изучают геном человека, создают ремиксы любимой музыки, находят лекарства от болезней, редактируют школьные учебники, изобретают новую косметику, пишут программное обеспечение и даже строят мотоциклы.Знания, ресурсы и вычислительные способности миллиардов людей самоорганизуются и превращаются в новую значительную коллективную силу, действующую согласованно и управляемую с помощью блогов, вики, чатов, сетей равноправных партнеров и личные трансляции.


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Программное обеспечение и его разработка

Автор книги — американский специалист по программированию, один из руководителей фирмы IBM, в своей книге делает попытку изложить общие проблемы создания программного обеспечения, его сопровождения и использования. Особенно подробно рассматриваются все фазы разработки программ разных типов. Изложение ясное, удачно иллюстрировано примерами.Для программистов разной квалификации и пользователей ЭВМ.fb2: ВНИМАНИЕ. В тексте присутствуют таблицы. Рекомендуется читать файл с помощью программы, поддерживающей их отображение.


Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Примеры использования Паттерн Singleton (Одиночка)

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Создаем порт для FreeBSD своими руками. Часть II

Система сборки программ, используемая во FreeBSD, имеет значительно большие возможности, чем те, которые мы задействовали. Какие это возможности и как их использовать в своих портах?


FreeBSD - полезные советы

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.