lxyscls 发表于 2017-01-10 09:09

yulihua49 发表于 2017-01-09 18:37
消费者得不到数据,死循环等?超过5个线程能比加锁性能高?32核弄32个线程没事死循环等?服务器嗷嗷叫。
...

消费者得不到数据,死循环等这个看情况的,多少次要不到就pause,再要不到就交出调度
超过5个线程能比加锁性能高?scale up的能力看具体实现了,加锁意味着所有线程都需要修改同一个变量,绝对是不利于scale up的。至于说没锁是不是就能scale up,也要看实现。
32核弄32个线程没事死循环等?一般要提供某种等待**的机制的,以便在没事的时候能睡
如果挂起,还要等事件解挂,跟等锁一样啊!那不就是条件锁吗?“挂起”只是在“确实”没事干的时候

lxyscls 发表于 2017-01-10 09:18

回复 10# yulihua49

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

sditmaner 发表于 2017-01-10 15:20

收藏了,感谢楼主的无私分享

yulihua49 发表于 2017-01-10 20:36

本帖最后由 yulihua49 于 2017-01-10 20:39 编辑

lxyscls 发表于 2017-01-10 09:18
回复 10# yulihua49

mutex + cond,地球人都这样用

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

yulihua49 发表于 2017-01-21 15:52

本帖最后由 yulihua49 于 2017-01-21 15:54 编辑

lxyscls 发表于 2017-01-10 09:09
这个看情况的,多少次要不到就pause,再要不到就交出调度
scale up的能力看具体实现了,加锁意味着所有 ...
一个服务器,确实没事的时候居多,不让他挂起?
现在还在纠结“无锁”的,有点钻牛犄角尖了。结果是,无锁的服务器性能更差。

bskay 发表于 2017-01-22 09:05

基本功不杂食要多练练, 有几个函数(4)实现了一个,其他的也应该显示的写出来,哪怕个缺省的一样

yulihua49 发表于 2017-01-28 20:52

bskay 发表于 2017-01-22 09:05
基本功不杂食要多练练, 有几个函数(4)实现了一个,其他的也应该显示的写出来,哪怕个缺省的一样

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

wlmqgzm 发表于 2017-02-13 18:13

本帖最后由 wlmqgzm 于 2017-02-13 18:27 编辑

yulihua49 发表于 2017-01-21 15:52
一个服务器,确实没事的时候居多,不让他挂起?
现在还在纠结“无锁”的,有点钻牛犄角尖了。结果是,无 ...
我还是觉得 无锁队列 绝对是未来的主力, 并且设计良好的无锁队列不会消耗更多的资源, 但是可以提供更强大更简单的工具。

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

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

template<typename T,size_t Capacity=WAIT_FREE_MPSC_QUEUE_IO_SERVICE_DEFAULT_SIZE>
classWait_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 );

    //当定义下列项后,生产者还会自动处理消费者返回的结果
    #ifdefWAIT_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 longget_push_count( void ) const;

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


template<typename T, size_t Capacity>
classWait_free_spsc_ios_queue: privateWait_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 );

    //当定义下列项后,生产者还会自动处理返回结果
    #ifdefWAIT_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 longget_push_count( void ) const;

yulihua49 发表于 2017-02-15 21:35

本帖最后由 yulihua49 于 2017-02-15 21:40 编辑

wlmqgzm 发表于 2017-02-13 18:13
我还是觉得 无锁队列 绝对是未来的主力, 并且设计良好的无锁队列不会消耗更多的资源, 但是可以提供更强 ...
看看消费者等待的程序。
哦。我似乎有点明白了。你是生产者push数据后才通过callback启动消费者?

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

l495051275 发表于 2017-02-18 20:23

{:1_1:}{:1_1:}{:1_1:}{:1_1:}
页: 1 [2]
查看完整版本: [结贴]利用std::atomic实现一个lockfree结构,析构的时候崩溃了