Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Strands: Use Threads Without Explicit Locking

Boost , Boost.Asio , Core Concepts and Functionality

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Строка определяется как строго последовательный вызов обработчиков событий (т.е. не одновременный вызов). Использование странд позволяет выполнять код в многоадресной программе без необходимости прямого блокировки (например, с использованием мутексов).

Строки могут быть либо косвенными, либо явными, о чем свидетельствуют следующие альтернативные подходы:

  • Вызов io_service::run() из одной нити означает, что все обработчики событий выполняют в неявной полосе, из-за гарантии io_service, что обработчики используются только из-за внутренней работы ().
  • Там, где есть одна цепь асинхронных операций, связанных с соединением (например, в полудуплексной реализации протокола, как HTTP), нет возможности параллельного выполнения обработчиков. Это неявная полоса.
  • io_service::strand. Все объекты функции обработчика событий должны быть обернуты с помощью io_service::strand::wrap() или иным образом размещены/отправлены через io_сервис::strand объект.

В случае сочиненных асинхронных операций, таких как async_read() или async_read_until(), если обработчик завершения проходит через полосу, то все промежуточные обработчики также должны пройти через одну и ту же полосу. Это необходимо для обеспечения безопасного доступа к резьбе для любых объектов, которые распределены между звонителем и сложенной операцией (в случае async_read() это розетка, которую звонящий может закрыть() для отмены операции). Это делается, имея функции крюка для всех промежуточных обработчиков, которые передают звонки на настраиваемый крючок, связанный с конечным обработчиком:

struct my_handler
{
  void operator()() { ... }
};
template<class F>
void asio_handler_invoke(F f, my_handler*)
{
  // Do custom invocation here.
  // Default implementation calls f();
}

io_service::strand::wrap() функция создает новый обработчик завершения, который определяет asio_handler_invoke так, что объект функции выполняется через строку.

See Also

io_service::strand, tutorial Timer.5, HTTP-сервер 3 пример.


PrevUpHomeNext

Статья Strands: Use Threads Without Explicit Locking раздела Boost.Asio Core Concepts and Functionality может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Core Concepts and Functionality ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:08:11/0.0065500736236572/0