首页 > 其他 > 详细

自定义内存分配

时间:2016-03-13 23:49:22      阅读:268      评论:0      收藏:0      [点我收藏+]
许多异步操作需要申请一个对象来保存操作状态,比如,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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!