许多异步操作需要申请一个对象来保存操作状态,比如,win32需要OVERLAPPED导出的对象来传递给win32 API函数。
此外,程序通常包括简单的可辨明的异步操作链,一个半双工协议(比如HTTP)为每一个client保存一个异步操作链(发送以后就是接收),一个全双工的协议可能拥有两个并行执行的链,程序要可以利用这点并重复利用异步操作链上的内存。
给定一个用户自定义句柄对象的拷贝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, ...);
都分别依据于操作符::operator new() 和::operator delete()
当前实现确保在调用关联句柄以前完成释放,这意味着在被一个句柄启动的任何异步操作都可以重新使用内存。
自定义内存申请函数可以被任何调用了库函数的用户创建线程调用,对那些调用了库的异步操作,实现并不会为了句柄的内存申请函数并发处理,实现需要插入一个适当的内存屏障来确保内存的可用性,内存申请函数需要在不同的线程调用
The implementation will insert appropriate memory barriers to ensure correct memory visibility should allocation functions need to be called from different threads.
自定义内存分配当前支持所有的异步操作
@ip::basic_resolver::async_resolve() ,支持所有平台
@basic_socket::async_connect() ,支持windows
@windows上任何调用null_buffers()的,除了一个异步读依赖于流导向的socket。
自定义内存分配
原文:http://www.cnblogs.com/learn-my-life/p/5274237.html