Библиотека волокон расширяет корутинную библиотеку, добавляя планировщик и механизмы синхронизации.
- Коротин дает
- волоконные блоки
Когда корутин уступает, он передает контроль непосредственно своему абоненту (или, в случае симметричных корутин, назначенному другому корутину). Когда волокно блокируется, оно неявно передает управление планировщику волокна. Корутины не имеют планировщика, потому что им не нужен планировщик..
GCC поддерживает транзакционную память с версии 4.7. К сожалению, тесты показывают, что транзакционная память медленнее (около 4х), чем шпинлоки с использованием атомов. После улучшения транзакционной памяти (поддерживающей гибридный tm) блоки будут заменены на __transaction_atomic.
Классы синхронизации отBoost. нитьЗаблокировать всю нить. В отличие от этого, классы синхронизации отBoost.Fiberблокировать только определенные волокна, так что планировщик может по-прежнему держать нить занятой за счет других волокон. Классы синхронизации отBoost.Fiberпредназначены для обеспечения безопасности ниток, т.е. возможно синхронизировать волокна, работающие в разных нитях, а также волокна, работающие в одной нити. (Однако есть опция сборки для отключения поддержки синхронизации поперечных волокон; см.это описание.)
Ложное пробуждение может произойти при использовании<std::condition_variable
>: переменная состояния, по-видимому, была сигнализирована, в то время как ожидаемое состояние все еще может быть ложным. Неправильное пробуждение может происходить неоднократно и вызвано в некоторых многопроцессорных системах, где пробуждение<std::condition_variable
>полностью предсказуемо замедляет все<std::condition_variable
>операции.
<condition_variable
>не подлежит ложному пробуждению. Тем не менее, целесообразно проверить бизнес-логическое состояние в цикле<wait()
>и #8212; или, эквивалентно, использовать одну из<wait(lock,
predicate)
>перегрузок.
См. такжеНикаких ложных пробуждений.
Была интегрирована поддержка миграции волокон между нитями. Определяемый пользователем планировщик должен вызывать<context::detach()
>по оптоволоконному контексту на исходной нити и<context::attach()
>на целевой поток, передавая оптоволоконный контекст для миграции. (Для получения дополнительной информации о пользовательских планировщиках см.Настройка.) Примеры<work_sharing
>и<work_stealing
>в каталоге<examples
>могут использоваться в качестве чертежа.
См. такжеМигрирующие волокна между нитями.
ПоддержкаBoost.Asio& #8217;sасинхронный результатне является частью официального API. Для сравнения:<boost::asio::io_service
>Обмен нитью с другой главной петлей. Для плавного взаимодействия с произвольной операцией ввода/вывода Asio async см.Then There’s Boost.Asio.
Библиотека была протестирована с GCC-5.1.1, Clang-3.6.0 и MSVC-14.0 в c++11-режиме.
Boost.Fiberзависит отBoost.Context— список поддерживаемых архитектур можно найти здесь.