zoukankan      html  css  js  c++  java
  • 自定义内存分配

    许多异步操作需要申请一个对象来保存操作状态,比如,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。
  • 相关阅读:
    ASP.NET WebAPI Get和Post 传参总结
    关于EF第一次加载慢或过一段时间不访问时再次访问加载慢问题的总结
    jqthumb.js缩略图插件-让缩略图正常显示而不变形
    解决kindeditor编辑器中使用百度地图时不能拖动坐标的问题
    Jzoj3591 数据
    Jzoj3590 珠链
    Jzoj3590 珠链
    C++蜂鸣器歌曲1
    C++蜂鸣器歌曲1
    Jzoj2309 辽哥游戏
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/5274237.html
Copyright © 2011-2022 走看看