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

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

>bool test_and_set(memory_order order = memory_order_seq_cst)

> volatile noexcept;

>bool test_and_set(memory_order order = memory_order_seq_cst)

> noexcept;

Результат

Атомарно устанавливает флаг.

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

>true, если флаг был установлен в точке вызова; >false, если флаг был сброшен.

Исключения

Нет.

Примечание. Это атомарная операция чтения-модификации-записи для ячейки памяти, содержащей >*this.

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

Атомарно устанавливает флаг и проверяет, был ли он установлен.

Объявление

>bool atomic_flag_test_and_set(

> volatile atomic_flag* flag) noexcept;

>bool atomic_flag_test_and_set(atomic_flag* flag) noexcept;

Результат

>return flag->test_and_set();

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

Атомарно устанавливает флаг и проверяет, был ли он установлен.

Объявление

>bool atomic_flag_test_and_set_explicit(

> volatile atomic_flag* flag, memory_order order) noexcept;

>bool atomic_flag_test_and_set_explicit(

> atomic_flag* flag, memory_order order) noexcept;

Результат

>return flag->test_and_set(order);

>STD::ATOMIC_FLAG::CLEAR, ФУНКЦИЯ-ЧЛЕН

Атомарно сбрасывает флаг.

Объявление

>void clear(memory_order order = memory_order_seq_cst) volatile noexcept;

>void clear(memory_order order = memory_order_seq_cst) noexcept;

Предусловия

Параметр order должен принимать одно из значений >std::memory_order_relaxed, >std::memory_order_release или >std::memory_order_seq_cst.

Результат

Атомарно сбрасывает флаг.

Исключения

Нет.

Примечание. Это атомарная операция сохранения для ячейки памяти, содержащей >*this.

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

Атомарно сбрасывает флаг.

Объявление

>void atomic_flag_clear(volatile atomic_flag* flag) noexcept;

>void atomic_flag_clear(atomic_flag* flag) noexcept;

Результат

>flag->clear();

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

Атомарно сбрасывает флаг.

Объявление

>void atomic_flag_clear_explicit(

> volatile atomic_flag* flag, memory_order order) noexcept;

>void atomic_flag_clear_explicit(

> atomic_flag* flag, memory_order order) noexcept;

Результат

>return flag->clear(order);

D.3.8. Шаблон класса >std::atomic

Шаблон класса >std::atomic является оберткой, позволяющей строить атомарные операции для любого типа, удовлетворяющего следующим условиям.

Параметр шаблона >BaseТуре должен:

• иметь тривиальный конструктор по умолчанию;

• иметь тривиальный копирующий оператор присваивания;

• иметь тривиальный деструктор;

• допускать побитовое сравнение на равенство.

По существу, это означает, что конкретизация >std::atomic<некоторый-встроенный-тип> допустима, как и конкретизация >std::atomic<некоторая-простая-структура>, но такие вещи, как >std::atomic, недопустимы.

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

Экземпляры >std::atomic не удовлетворяют требованиям концепций >CopyConstructible и >CopyAssignable, потому что такие операции невозможно выполнить атомарно.

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

>template

>struct atomic {

> atomic() noexcept = default;

> constexpr atomic(BaseType) noexcept;

> BaseType operator=(BaseType) volatile noexcept;

> BaseType operator=(BaseType) noexcept;


> atomic(const atomic&) = delete;

> atomic& operator=(const atomic&) = delete;

> atomic& operator=(const atomic&) volatile = delete;


> bool is_lock_free() const volatile noexcept;

> bool is_lock_free() const noexcept;

> void store(BaseType, memory_order = memory_order_seq_cst)

>  volatile noexcept;

> void store(BaseType, memory_order = memory_order_seq_cst)

>  noexcept;

> BaseType load(memory_order = memory_order_seq_cst)

>  const volatile noexcept;

> BaseType load(memory_order = memory_order_seq_cst)

>  const noexcept;

> BaseType exchange(BaseType, memory_order = memory_order_seq_cst)

>  volatile noexcept;

> BaseType exchange(BaseType, memory_order = memory_order_seq_cst)

>  noexcept;


> bool compare_exchange_strong(

>  BaseType & old_value, BaseType new_value,

>  memory_order order = memory_order_seq_cst) volatile noexcept;

> bool compare_exchange_strong(

>  BaseType & old_value, BaseType new_value,

>  memory_order order = memory_order_seq_cst) noexcept;

> bool compare_exchange_strong(

>  BaseType & old_value, BaseType new_value,

>  memory_order success_order,

>  memory_order failure_order) volatile noexcept;

> bool compare_exchange_strong(

>  BaseType & old_value, BaseType new_value,

>  memory_order success_order,

>  memory_order failure_order) noexcept;

> bool compare_exchange_weak(

>  BaseType & old_value, BaseType new_value,

>  memory_order order = memory_order_seq_cst)

>  volatile noexcept;

> bool compare_exchange_weak(

>  BaseType & old_value, BaseType new_value,

>  memory_order order = memory_order_seq_cst) noexcept;

> bool compare_exchange_weak(

>  BaseType & old_value, BaseType new_value,

>  memory_order success_order,

>  memory_order failure_order) volatile noexcept;

> bool compare_exchange_weak(

>  BaseType & old_value, BaseType new_value,

>  memory_order success_order,

>  memory_order failure_order) noexcept;


> operator BaseType() const volatile noexcept;


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

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


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


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

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


Пользовательские истории. Искусство гибкой разработки ПО

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


Идиомы и стили С++

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


Симуляция частичной специализации

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


Тонкости дизассемблирования

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