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

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

Класс >std::mutex предоставляет базовые средства взаимного исключения и синхронизации потоков, применяемые для защиты разделяемых данных. Перед тем как обращаться к данным, защищаемым мьютексом, этот мьютекс необходимо захватить (или заблокировать), вызвав функцию >lock() или >try_lock(). В любой момент времени удерживать мьютекс может только один поток; если другой поток попытается захватить тот же мьютекс, то функция >try_lock() вернет ошибку, а функция >lock() приостановит выполнение потока. Закончив операции над разделяемыми данными, поток должен вызвать функцию >unlock(), чтобы освободить мьютекс и дать другим потокам возможность захватить его.

Экземпляр >std::mutex удовлетворяет требованиям концепции >Lockable.

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

>class mutex {

>public:

> mutex(mutex const&)=delete;

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


> constexpr mutex() noexcept;

> ~mutex();


> void lock();

> void unlock();

> bool try_lock();

>};

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

Конструирует объект >std::mutex.

Объявление

>constexpr mutex() noexcept;

Результат

Конструирует экземпляр >std::mutex.

Постусловия

Вновь сконструированный объект >std::mutex первоначально не захвачен.

Исключения

Нет.

>STD::MUTEX, ДЕСТРУКТОР

Уничтожает объект >std::mutex.

Объявление

>~mutex();

Предусловия

Объект >*this не должен быть захвачен.

Результат

Уничтожает >*this.

Исключения

Нет.

>STD::MUTEX::LOCK, ФУНКЦИЯ-ЧЛЕН

Захватывает объект >std::mutex для текущего потока.

Объявление

>void lock();

Предусловия

Вызывающий поток не должен удерживать мьютекс >*this.

Результат

Блокирует текущий поток, пока мьютекс >*this не будет захвачен.

Постусловия

>*this захвачен текущим потоком.

Исключения

Исключение типа >std::system_error в случае ошибки.

>STD::MUTEX::TRY_LOCK, ФУНКЦИЯ-ЧЛЕН

Пытается захватить объект >std::mutex для текущего потока.

Объявление

>bool try_lock();

Предусловия

Вызывающий поток не должен удерживать мьютекс >*this.

Результат

Пытается захватить объект >std::mutex для текущего потока без блокирования.

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

>true, если вызывающий поток захватил мьютекс, иначе >false.

Постусловия

>*this захвачен вызывающим потоком, если функция вернула >true.

Исключения

Нет.

Примечание. Функция может не захватить мьютекс (и вернуть >false), даже если никакой другой поток не удерживает >*this.

>STD::MUTEX::UNLOCK, ФУНКЦИЯ-ЧЛЕН

Освобождает объект >std::mutex, удерживаемый текущим потоком.

Объявление

>void unlock();

Предусловия

Вызывающий поток должен удерживать мьютекс >*this.

Результат

Освобождает мьютекс >std::mutex, удерживаемый текущим потоком.

Если другие потоки были блокированы в ожидании >*this, то один из них разблокируется.

Постусловия

>*this не захвачен вызывающим потоком.

Исключения

Нет.

D.5.2. Класс >std::recursive_mutex

Класс >std::recursive_mutex предоставляет базовые средства взаимного исключения и синхронизации потоков, применяемые для защиты разделяемых данных. Перед тем как обращаться к данным, защищаемым мьютексом, этот мьютекс необходимо захватить (или заблокировать), вызвав функцию >lock() или >try_lock(). В любой момент времени удерживать мьютекс может только один поток; если другой поток попытается захватить тот же мьютекс, то функция >try_lock() вернет ошибку, а функция >lock() приостановит выполнение потока. Закончив операции над разделяемыми данными, поток должен вызвать функцию >unlock(), чтобы освободить мьютекс и дать другим потокам возможность захватить его.

Этот мьютекс называется рекурсивным, потому что поток, удерживающий мьютекс типа >std::recursive_mutex, может снова обратиться к функции >lock() или >try_lock(), что приведёт к увеличению счетчика захватов. Никакой другой поток не сможет захватить этот мьютекс, пока владеющий им поток не вызовет функцию >unlock столько раз, сколько было успешных вызовов >lock() или >try_lock().

Экземпляр >std::recursive_mutex удовлетворяет требованиям концепции >Lockable.

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

>class recursive_mutex {

>public:

> recursive_mutex(recursive_mutex const&) = delete;

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

> recursive_mutex() noexcept;

> ~recursive_mutex();


> void lock();

> void unlock();

> bool try_lock() noexcept;

>};

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

Конструирует объект >std::recursive_mutex.

Объявление

>recursive_mutex() noexcept;

Результат

Конструирует экземпляр >std::recursive_mutex.

Постусловия

Вновь сконструированный объект >std::recursive_mutex первоначально не захвачен.

Исключения

Исключение типа >std::system_error, если не удалось создать экземпляр >std::recursive_mutex.

>STD::RECURSIVE_MUTEX, ДЕСТРУКТОР

Уничтожает объект >std::recursive_mutex.

Объявление

>~recursive_mutex();

Предусловия

Объект >*this не должен быть захвачен.

Результат

Уничтожает >*this.

Исключения

Нет.

>STD::RECURSIVE_MUTEX::LOCK, ФУНКЦИЯ-ЧЛЕН

Захватывает объект >std::recursive_mutex для текущего потока.

Объявление

>void lock();

Результат

Блокирует текущий поток, пока мьютекс >*this не будет захвачен.

Постусловия

>*this захвачен текущим потоком. Если вызывающий поток уже удерживал >*this, то счетчик захватов увеличивается на единицу.

Исключения

Исключение типа >std::system_error в случае ошибки.

>STD::RECURSIVE_MUTEX::TRY_LOCK, ФУНКЦИЯ-ЧЛЕН

Пытается захватить объект >std::recursive_mutex


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

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


Рекомендуем почитать
Исчерпывающее руководство по написанию всплывающих подсказок

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


Как писать драйвера

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


MFC и OpenGL

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


Язык программирования С# 2005 и платформа .NET 2.0.

В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML.


Делегаты на C++

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