Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Название:Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
- Автор:
- Жанр:
- Издательство:ДМК Пресс
- Год:2012
- Город:Москва
- ISBN:978-5-94074-448-1
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Энтони Уильямс - Параллельное программирование на С++ в действии. Практика разработки многопоточных программ краткое содержание
Книга «Параллельное программирование на С++ в действии» не предполагает предварительных знаний в этой области. Вдумчиво читая ее, вы научитесь писать надежные и элегантные многопоточные программы на С++11. Вы узнаете о том, что такое потоковая модель памяти, и о том, какие средства поддержки многопоточности, в том числе запуска и синхронизации потоков, имеются в стандартной библиотеке. Попутно вы познакомитесь с различными нетривиальными проблемами программирования в условиях параллелизма.
Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Исключения
std::bad_alloc
, если не удалось выделить внутреннюю память или std::future_error
, если не удалось добиться желаемого эффекта, или исключение, возбужденное в ходе конструирования fff
или xyz...
.
D.5. Заголовок
В заголовке объявлены средства, обеспечивающие взаимное исключение: типы мьютексов и блокировок, различные функции и механизм, гарантирующий, что некая операция выполнена ровно один раз.
Содержимое заголовка
namespace std {
class mutex;
class recursive_mutex;
class timed_mutex;
class recursive_timed_mutex;
struct adopt_lock_t;
struct defer_lock_t;
struct try_to_lock_t;
constexpr adopt_lock_t adopt_lock{};
constexpr defer_lock_t defer_lock{};
constexpr try_to_lock_t try_to_lock{};
template
class lock_guard;
template
class unique_lock;
template
void lock(LockableType1& m1, LockableType2& m2...);
template
int try_lock(LockableType1& m1, LockableType2& m2...);
struct once_flag;
template
void call_once(once_flag& flag, Callable func, Args args...);
}
D.5.1. Класс std::mutex
Класс 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
для текущего потока.
Интервал:
Закладка: