- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2017-02-13 18:27 编辑
我还是觉得 无锁队列 绝对是未来的主力, 并且设计良好的无锁队列不会消耗更多的资源, 但是可以提供更强大更简单的工具。
下面贴出我公司内部的无锁队列 设计, 看看是否使用起来很简单, 
下面是一个多生产者单消费者的无锁队列,用户程序中只需要预先定义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;
|
|