Многие асинхронные операции должны выделять объект для хранения состояния, связанного с операцией. Например, для реализации Win32 требуется OVERLAPPED
-производные объекты для передачи в функции Win32 API.
Кроме того, программы обычно содержат легко идентифицируемые цепочки асинхронных операций. Реализация полудуплексного протокола (например, HTTP-сервер) будет иметь одну цепочку операций на клиента (приемы, за которыми следуют отправки). Полная реализация дуплексного протокола будет иметь две цепи, выполняющиеся параллельно. Программы должны иметь возможность использовать эти знания для повторного использования памяти для всех асинхронных операций в цепи.
При наличии копии определяемого пользователем Handler
объекта h
, если реализации необходимо выделить память, связанную с этим обработчиком, она выполнит код:
void* pointer = asio_handler_allocate(size, &h);
Точно так же, чтобы распределить память, она будет выполнять:
asio_handler_deallocate(pointer, size, &h);
Эти функции расположены с использованием аргумент-зависимого поиска. Реализация обеспечивает реализацию по умолчанию вышеуказанных функций в пространстве имен asio
:
void* asio_handler_allocate(size_t, ...);
void asio_handler_deallocate(void*, size_t, ...);
которые реализуются в терминах ::операторновый()
и ::оператор()
соответственно.
Реализация гарантирует, что распределение транзакций произойдет до вызова соответствующего обработчика, что означает, что память готова к повторному использованию для любых новых асинхронных операций, начатых обработчиком.
Настраиваемые функции распределения памяти могут быть вызваны из любого созданного пользователем потока, который вызывает функцию библиотеки. Реализация гарантирует, что для асинхронных операций, включенных в библиотеку, реализация не будет делать параллельные вызовы функциям распределения памяти для этого обработчика. Реализация вставит соответствующие барьеры памяти для обеспечения правильной видимости памяти, если функции распределения должны быть вызваны из разных потоков.
asio_handler_allocate, asio_handler_deallocate, custom memory allocation example (C++03), custom memory allocation example (C++11).