免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2017-01-10 09:09 |只看该作者
yulihua49 发表于 2017-01-09 18:37
消费者得不到数据,死循环等?超过5个线程能比加锁性能高?32核弄32个线程没事死循环等?服务器嗷嗷叫。
...
消费者得不到数据,死循环等
这个看情况的,多少次要不到就pause,再要不到就交出调度
超过5个线程能比加锁性能高?
scale up的能力看具体实现了,加锁意味着所有线程都需要修改同一个变量,绝对是不利于scale up的。至于说没锁是不是就能scale up,也要看实现。
32核弄32个线程没事死循环等?
一般要提供某种等待**的机制的,以便在没事的时候能睡
如果挂起,还要等事件解挂,跟等锁一样啊!那不就是条件锁吗?
“挂起”只是在“确实”没事干的时候

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2017-01-10 09:18 |只看该作者
回复 10# yulihua49

mutex + cond,地球人都这样用
消费者在此挂起等待,用户态pause。你会比他效率高?
cond选择**是明确的,不会出现竞争;retry的话,大家要去抢,但是对于某个抢到资源的线程来讲,更即时

论坛徽章:
2
综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:00
13 [报告]
发表于 2017-01-10 15:20 |只看该作者
收藏了,感谢楼主的无私分享

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
14 [报告]
发表于 2017-01-10 20:36 |只看该作者
本帖最后由 yulihua49 于 2017-01-10 20:39 编辑
lxyscls 发表于 2017-01-10 09:18
回复 10# yulihua49

mutex + cond,地球人都这样用

目前没有比这更好的办法。你要提供挂起/解挂的方法。“唤 * 醒”是敏感词。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
15 [报告]
发表于 2017-01-21 15:52 |只看该作者
本帖最后由 yulihua49 于 2017-01-21 15:54 编辑
lxyscls 发表于 2017-01-10 09:09
这个看情况的,多少次要不到就pause,再要不到就交出调度
scale up的能力看具体实现了,加锁意味着所有 ...

一个服务器,确实没事的时候居多,不让他挂起?
现在还在纠结“无锁”的,有点钻牛犄角尖了。结果是,无锁的服务器性能更差。

论坛徽章:
11
2015年迎新春徽章
日期:2015-03-04 09:55:282017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之辽宁
日期:2016-12-15 10:24:1715-16赛季CBA联赛之佛山
日期:2016-11-30 09:04:2015-16赛季CBA联赛之江苏
日期:2016-04-29 15:56:1215-16赛季CBA联赛之同曦
日期:2016-04-12 13:21:182016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之山东
日期:2016-02-16 11:37:52每日论坛发贴之星
日期:2016-02-07 06:20:00程序设计版块每日发帖之星
日期:2016-02-07 06:20:0015-16赛季CBA联赛之新疆
日期:2018-01-09 16:25:37
16 [报告]
发表于 2017-01-22 09:05 |只看该作者
基本功不杂食要多练练, 有几个函数(4)实现了一个,其他的也应该显示的写出来,哪怕个缺省的一样

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
17 [报告]
发表于 2017-01-28 20:52 |只看该作者
bskay 发表于 2017-01-22 09:05
基本功不杂食要多练练, 有几个函数(4)实现了一个,其他的也应该显示的写出来,哪怕个缺省的一样

你那个贴了代码的帖子也删了?我跟你讨论,有代码,发不出来。论坛什么鬼?

论坛徽章:
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
18 [报告]
发表于 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;

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
19 [报告]
发表于 2017-02-15 21:35 |只看该作者
本帖最后由 yulihua49 于 2017-02-15 21:40 编辑
wlmqgzm 发表于 2017-02-13 18:13
我还是觉得 无锁队列 绝对是未来的主力, 并且设计良好的无锁队列不会消耗更多的资源, 但是可以提供更强 ...

看看消费者等待的程序。
哦。我似乎有点明白了。你是生产者push数据后才通过callback启动消费者?

可是我们的应用场景是消费者是一堆线程等着你喂数据。就是那个map/reduce模型。

论坛徽章:
0
20 [报告]
发表于 2017-02-18 20:23 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP