В общем, безопасно одновременное использование различных объектов, но небезопасно одновременное использование одного объекта. Однако такие типы, как<io_service
>, обеспечивают более надежную гарантию того, что безопасно использовать один объект одновременно.
Несколько потоков могут вызывать<io_service::run()
>для создания пула потоков, из которых могут вызываться обработчики завершения. Этот подход также может быть использован с<io_service::post()
>для использования средства для выполнения любых вычислительных задач в пуле потоков.
Обратите внимание, что все нити, которые присоединились к пулу<io_service
>, считаются эквивалентными, и<io_service
>могут распределять работу по ним произвольным образом.
Реализация этой библиотеки для конкретной платформы может использовать один или несколько внутренних потоков для эмуляции асинхронности. Насколько это возможно, эти потоки должны быть невидимы для пользователя библиотеки. В частности, нити:
- не должны напрямую вызывать код пользователя; и
- Необходимо блокировать все сигналы.
Этот подход дополняется следующей гарантией:
- Асинхронные обработчики завершения будут вызываться только из потоков, которые в настоящее время вызывают<
io_service::run()
>.
Следовательно, пользователь библиотеки несет ответственность за создание и управление всеми потоками, к которым будут доставлены уведомления.
Причины такого подхода включают:
- При вызове<
io_service::run()
>из одного потока код пользователя может избежать сложности разработки, связанной с синхронизацией. Например, пользователь библиотеки может реализовать масштабируемые серверы, которые являются однопоточными (с точки зрения пользователя).
- Пользователю библиотеки может потребоваться выполнить инициализацию в потоке вскоре после запуска потока и до выполнения любого другого кода приложения. Например, пользователи Microsoft COM должны позвонить<
CoInitializeEx
>, прежде чем можно будет вызвать какие-либо другие операции COM из этого потока.
- Интерфейс библиотеки отделяется от интерфейсов для создания и управления потоками и допускает реализацию на платформах, где потоки недоступны.
io_service.