boost::lockfree使用介绍

boost::lockfree使用介绍boost::lockfree是boost1.53引入的无锁数据结构,包括boost::lockfree::stack、boost::lockfree::queue和boost::lockfree::spsc_queue三种,前两种用于多生产者/多消费者场景,第三个用于单生产者/单消费者场景,下面对它们的使用进行详细介绍,以boost::lockfree::stack为例,其他类似。构造boo…

大家好,又见面了,我是你们的朋友全栈君。

boost::lockfree是boost1.53引入的无锁数据结构,包括boost::lockfree::stack、boost::lockfree::queue和boost::lockfree::spsc_queue三种,前两种用于多生产者/多消费者场景,第三个用于单生产者/单消费者场景,下面对它们的使用进行详细介绍,以boost::lockfree::stack为例,其他类似。

构造

boost::lockfree::stack源代码如下(boost 1.65):

#ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES template <typename T, class A0, class A1, class A2> #else template <typename T, typename ...Options> #endif class stack { private: #ifndef BOOST_DOXYGEN_INVOKED BOOST_STATIC_ASSERT(boost::is_copy_constructible<T>::value); #ifdef BOOST_NO_CXX11_VARIADIC_TEMPLATES typedef typename detail::stack_signature::bind<A0, A1, A2>::type bound_args; #else typedef typename detail::stack_signature::bind<Options...>::type bound_args; #endif static const bool has_capacity = detail::extract_capacity<bound_args>::has_capacity; static const size_t capacity = detail::extract_capacity<bound_args>::capacity; static const bool fixed_sized = detail::extract_fixed_sized<bound_args>::value; static const bool node_based = !(has_capacity || fixed_sized); static const bool compile_time_sized = has_capacity; /* 省略 */ public: typedef T value_type; typedef typename implementation_defined::allocator allocator; typedef typename implementation_defined::size_type size_type; //! Construct stack // @{ stack(void): pool(node_allocator(), capacity) { BOOST_ASSERT(has_capacity); initialize(); } template <typename U> explicit stack(typename node_allocator::template rebind<U>::other const & alloc): pool(alloc, capacity) { BOOST_STATIC_ASSERT(has_capacity); initialize(); } explicit stack(allocator const & alloc): pool(alloc, capacity) { BOOST_ASSERT(has_capacity); initialize(); } // @} //! Construct stack, allocate n nodes for the freelist. // @{ explicit stack(size_type n): pool(node_allocator(), n) { BOOST_ASSERT(!has_capacity); initialize(); } template <typename U> stack(size_type n, typename node_allocator::template rebind<U>::other const & alloc): pool(alloc, n) { BOOST_STATIC_ASSERT(!has_capacity); initialize(); }

boost::lockfree::stack的第一个模板参数是元素类型,后面3个参数是用来配置stack的,没有顺序要求:

  • boost::lockfree::fixed_sized:是否固定大小,默认为boost::lockfree::fixed_sized<false>,如果为true,则内部使用数组保存元素,大小不能动态增长;
  • boost::lockfree::capacity:编译时设置内部数组大小,设置了capacity意味着一定是boost::lockfree::fixed_sized<true>,和运行时指定大小是互斥的,见下面的例子;
  • boost::lockfree::allocator:设置分配器,默认boost::lockfree::allocator<std::allocator<void>>

例如:

//表示动态大小,初始大小为4,用完了再动态增长;此时必须在构造函数指定初始大小,否则断言失败;
boost::lockfree::stack<int> s(4);

//表示大小固定,运行时指定初始大小为4,用完后再push就会失败;此时必须在构造函数指定初始大小,否则断言失败;
boost::lockfree::stack<int, boost::lockfree::fixed_sized<true>> s1(4);

//表示大小固定,编译时指定初始大小为4,用完后再push就会失败;此时不能在构造函数指定初始大小,否则断言失败;
boost::lockfree::stack<int, boost::lockfree::capacity<4>> s2;

//和上面一样,设置了capacity,fixed_size就总是true
boost::lockfree::stack<int, boost::lockfree::fixed_size<false>, boost::lockfree::capacity<4>> s3;

成员方法

  • push:压入一个元素到容器,除了unsynchronized_,都是线程安全的。所有都是非阻塞的。
bool push(T const & v)

bool bounded_push(T const & v)

template <typename ConstIterator>
ConstIterator push(ConstIterator begin, ConstIterator end)

template <typename ConstIterator>
ConstIterator bounded_push(ConstIterator begin, ConstIterator end)

bool unsynchronized_push(T const & v)
ConstIterator unsynchronized_push(ConstIterator begin, ConstIterator end)

bounded_表示不动态增长,当初始大小用完后再push就会失败;
unsynchronized_表示非线程安全;

  • pop:从容器中弹出一个元素,除了unsynchronized_,都是线程安全的。所有都是非阻塞的。
bool pop(T & ret)

template <typename U>
bool pop(U & ret)

bool unsynchronized_pop(T & ret)

template <typename U>
bool unsynchronized_pop(U & ret)

unsynchronized_表示非线程安全;

  • consume_:从容器弹出1个或全部元素,并应用某个函数对象。线程安全或阻塞与否取决于函数对象。
template <typename Functor>
bool consume_one(Functor & f)

template <typename Functor>
bool consume_one(Functor const & f)

template <typename Functor>
size_t consume_all(Functor & f)

template <typename Functor>
size_t consume_all(Functor const & f)

template <typename Functor>
size_t consume_all_atomic(Functor & f)

template <typename Functor>
size_t consume_all_atomic(Functor const & f)

template <typename Functor>
size_t consume_all_atomic_reversed(Functor & f)

template <typename Functor>
size_t consume_all_atomic_reversed(Functor const & f)

_one表示只消费1个元素;
_all表示消费所有元素;
_atomic表示消费过程是原子的,其间其他操作对其是不可见的。
_reversed表示倒序消费。

  • 其他
//预分配空闲节点数,和编译时设置capacity互斥;线程安全,可能阻塞
void reserve(size_type n)
//非线程安全
void reserve_unsafe(size_type n)
//判断是否为空
bool empty(void) const

简单示例

#include <boost/lockfree/stack.hpp>
int main(int argc, char *argv[])
{
    boost::lockfree::stack<int> s(64);
    //producer
    for (int i = 0; i < 1000; i++)
    {
        s.push(i);
    }
    //consumer
    s.consume_all([](int i)
    {
        std::cout << i << std::endl;
    });
    return 0;
}

转载于:https://www.cnblogs.com/zhongpan/p/7526903.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/161706.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • c++ 指针赋值「建议收藏」

    c++ 指针赋值「建议收藏」
    一、一级指针
     
    char*a=”a”;
    char *b=”b”;
     
    a=b;//这个是b把存的内容b给a,此时a的内容是b,所以指针与指针赋值实际也是传值,和普通变量一样。若a的内容变为c,则b的内容还是b
     
    二、二级指针
     
    char**c=&a;
     
    char**d=&b;
     
    c=d;//这样是把b的地址给了c,此时d和c都指向b,若c的内容发生改变

  • 影响中国互联网的100人[通俗易懂]

    影响中国互联网的100人[通俗易懂]影响中国互联网的100人分类:>>社会>>IT2004-10-0323:136932人阅读评论(0)收藏举报互联网:中国10年最大的变革因素  10年来,中国的成就举世瞩目,推动中国变革的重大因素举不胜举。但是,要选择一个影响中国过去、现在和未来的最大的变革因素,那么肯定非互联网莫属。虽然,人们看到的更多是互联网股票的跌宕起伏

  • linux convert命令把gif转jpg

    linux convert命令把gif转jpg命令:convertxx.gifxx.jpg会把gif的帧拆开为很多独立的xx-1.jpg,xx-2.jpg,xx-3.jpg…如果只取其中某一帧(如下,取第0帧):convert‘images.gif[0]‘image.pngfrom:https://www.php.cn/php-weizijiaocheng-258124.html…

  • matlabGUI入门

    matlabGUI入门1基础知识1.1函数1.2数据类型1.3绘图1.4其它2GUIDE2.1创建GUI界面2.2模板选择2.3控件2.4对象浏览器2.5回调函数2.6属性检查器2.7数据传输由窗口、菜单、图标、光标、按键、对话框和文本等各种图形对象组成的用户界面叫作图形用户界面(GUI)。它可以允许用户定制与MATLAB的交互方式,从而命令窗口不再是唯一与MATLAB的交互方式。用户通过鼠标或键盘选择、激活这些图形对象,使计算机产生某种动作或变化。

  • ORM常用字段介绍

    Django中的ORMDjango项目使用MySQL数据库1.在Django项目的settings.py文件中,配置数据库连接信息:2.在Django项目的__init__.py文件中写如下

  • Java面向对象三大特性学习总结

    Java面向对象三大特性学习总结面向对象的三大特性:封装、继承、多态将对象的属性和实现细节隐藏起来,不让外部程序直接进行访问,将属性私有化,仅对外公开接口,让外部程序通过类提供的方法来对隐藏信息进行访问和操作。好处是外部程序只能通过类规定的方法对数据进行访问,避免外界程序对类内部属性进行破坏。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号