免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: asker160
打印 上一主题 下一主题

[C++] [结贴]利用std::atomic实现一个lockfree结构,析构的时候崩溃了 [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
1 [报告]
发表于 2017-02-13 18:13 |显示全部楼层
本帖最后由 wlmqgzm 于 2017-02-13 18:27 编辑
yulihua49 发表于 2017-01-21 15:52
一个服务器,确实没事的时候居多,不让他挂起?
现在还在纠结“无锁”的,有点钻牛犄角尖了。结果是,无 ...

我还是觉得 无锁队列 绝对是未来的主力, 并且设计良好的无锁队列不会消耗更多的资源, 但是可以提供更强大更简单的工具。

下面贴出我公司内部的无锁队列 设计, 看看是否使用起来很简单,

下面是一个多生产者单消费者的无锁队列,用户程序中只需要预先定义2个回调函数,然后任意时候只要push数据,消费者自动处理数据, 处理完数据后, 可以自动回调生产者call_back, 获得结果进行后续再处理。
队列中无数据,则不占用任何CPU资源。

template<typename T,size_t Capacity=WAIT_FREE_MPSC_QUEUE_IO_SERVICE_DEFAULT_SIZE>
class  Wait_free_mpsc_ios_queue
{
  public:
    Wait_free_mpsc_ios_queue( unsigned short ushort_ios_num_begin, unsigned short ushort_ios_num_end );
    Wait_free_mpsc_ios_queue( unsigned short ushort_ios_num_begin, unsigned short ushort_ios_num_end,
           std::shared_ptr<boost::asio::io_service>  sp_ios_pop_in, std::function<void(T&>  function_pop_in );
    ~Wait_free_mpsc_ios_queue( void );

    // 定义下列,  只需要push数据, 然后消费者会自动处理数据,
    void   set_ios_and_fuction_pop( std::shared_ptr<boost::asio::io_service>  sp_ios_pop_in, std::function<void(T&>  function_pop_in );
    void   set_function_after_pop_all( std::function<void(void)>  function_in );

    //  当定义下列项后,  生产者还会自动处理消费者返回的结果
    #ifdef  WAIT_FREE_SPSC_QUEUE_WITH_PUSH_CALLBACK
    void   set_fuction_push_callback( std::function<void(T&>  function_push_in );
    bool   push_callback_empty( void ) const;
    bool   push_callback_empty( unsigned short ushort_ios_num ) const;
    #endif // WAIT_FREE_SPSC_QUEUE_WITH_PUSH_CALLBACK

    bool   push( T& t_in, unsigned short ushort_ios_num );  //生产者执行
    void   push_util_success( T& t_in, unsigned short ushort_ios_num );

    bool   full( unsigned short ushort_ios_num ) const;
    bool   empty( void ) const;
    bool   empty( unsigned short ushort_ios_num ) const;
    size_t size( void ) const;
    size_t capacity( void ) const;
    bool   is_lock_free( void ) const;

    void   set_bool_fast_quit( bool bool_fast_quit );
    unsigned long long  get_push_count( void ) const;

单生产者单消费者无锁队列


template<typename T, size_t Capacity>
class  Wait_free_spsc_ios_queue: private  Wait_free_spsc_queue<T,Capacity>
{
  public:
    Wait_free_spsc_ios_queue( std::shared_ptr<boost::asio::io_service>  sp_ios_pop_in, std::function<void(T&>  function_pop_in );
    Wait_free_spsc_ios_queue( void );
    ~Wait_free_spsc_ios_queue( void );
   
  // 定义下列,  只需要push数据, 然后消费者会自动处理数据,
    void   set_ios_and_fuction_pop( std::shared_ptr<boost::asio::io_service>  sp_ios_pop_in, std::function<void(T&>  function_pop_in );
    void   set_function_after_pop_all( std::function<void(void)>  function_in );

    //  当定义下列项后,  生产者还会自动处理返回结果
    #ifdef  WAIT_FREE_SPSC_QUEUE_WITH_PUSH_CALLBACK
    void   set_ios_and_fuction_push_callback( std::shared_ptr<boost::asio::io_service>  sp_ios_push, std::function<void(T&>  function_push_in );
    bool   push_callback_empty( void) const;
    #endif // WAIT_FREE_SPSC_QUEUE_WITH_PUSH_CALLBACK

    bool   push( T& t_in );  //生产者执行
    void   push_util_success( T& t_in );

    bool   full( void ) const;
    bool   empty( void) const;
    size_t size( void ) const;
    size_t capacity( void ) const;
    bool   is_lock_free( void ) const;

    void   set_bool_fast_quit( bool bool_fast_quit );
    unsigned long long  get_push_count( void ) const;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP