Класс / пространство имен | Функции | Возвращаемые значения |
---|---|---|
std::this_thread пространство имен | sleep_for( | Неприменимо |
std::condition_variable или std::condition_variable_any | wait_for( | std::cv_status::timeout или std::cv_status::no_timeout |
wait_for( | bool — значение, возвращенное предикатом при пробуждении | |
std::timed_mutex или std::recursive_timed_mutex | try_lock_for( | bool — true , если мьютекс захвачен, иначе false |
std::unique_lock<TimedLockable> | unique_lock( | Неприменимо — функция owns_lock() для вновь сконструированного объекта возвращает true , если мьютекс захвачен, иначе false |
try_lock_for( | bool — true , если мьютекс захвачен, иначе false | |
std::future или std::shared_future | wait_for( | std::future_status::timeout , если истек таймаут, std::future_status::ready , если будущий результат готов, std::future_status::deferred , если в будущем результате хранится отложенная функция, которая еще не начала исполняться |
Теперь, когда мы рассмотрели условные переменные, будущие результаты, обещания и упакованные задачи, настало время представить более широкую картину их применения для синхронизации операций, выполняемых в разных потоках.
4.4. Применение синхронизации операций для упрощения кода
Использование описанных выше средств синхронизации в качестве строительных блоков позволяет сосредоточиться на самих нуждающихся в синхронизации операциях, а не на механизмах реализации. В частности, код можно упростить, применяя более
4.4.1. Функциональное программирование с применением будущих результатов
Термином sin
, cos
и sqrt
, а также простые операции над примитивными типами, например 3+3
, 6*9
или 1.3/4.7
.
При таком подходе становится проще рассуждать о функциях, особенно в присутствии параллелизма, поскольку многие связанные с разделяемой памятью проблемы, обсуждавшиеся в главе 3, просто не возникают. Если разделяемые данные не модифицируются, то не может быть никакой гонки и, стало быть, не нужно защищать данные с помощью мьютексов. Это упрощение настолько существенно, что в программировании параллельных систем все более популярны становятся такие языки, как Haskell[9], где все функции чистые