Boost Lockfree

flyfish 2014-9-30

为了最大限度的挖掘并行编程的性能考虑使用与锁无关的数据结构来编程

与锁无关的数据结构不是依赖于锁和相互排斥来确保线程安全。





Lockfree的重要操作就是CAS(Compare And Set)原子操作

原子操作就是多个线程訪问同一个资源时,有且仅有唯一 一个线程对该资源进行操作

BOOST中的宏定义

BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG8B

BOOST_ATOMIC_DETAIL_X86_HAS_CMPXCHG16B

cmpxchg:比較并交换,也就是

伪代码

bool CAS(int* p,int nOld,int nNew)
{
bool bRet=false;
if (*p == nOld)
{
*p=nNew;
bRet=true;
} return bRet;
}

CAS操作产生的ABA问题



两个线程P1和P2

P1读变量A

P1中断,

P2開始执行,读变量A,更改为B,又更改为A,

P2运行完

P1继续操作,A还是A,P1觉得什么也没有发生





比如

栈 (Stack)是一种后进先出(last in first off,LIFO)的数据结构,仅仅同意在栈顶操作。

如果有一个栈,有三个元素

A

B

C

线程P1,P2对该栈进行操作

P1 读栈顶A

P1 中断

P2 開始执行,A出栈,B出栈,A压栈(删除B)

P1 继续运行,A还是A

P1觉得该栈的结构还是ABC,而此时栈里仅仅有两个元素





就像小时候在家偷看电视,防止电视过热被父母发现,看一会儿就关上,等会儿再看。

当听见开门的声音时,以迅雷不及掩耳之势,换回開始的频道,调回音量图标的格数,关上电视,放回遥控器原来的位置并注意遥控器的朝向来表明没有看电视。





64位平台的处理方案

看boost::lockfree::detail::tagged_ptr代码



解决方案1

文件tagged_ptr_dcas.hpp

简化代码

template <class T>
class tagged_ptr
{
public:
typedef std::size_t tag_t;
protected:
T * ptr;
tag_t tag;
};

ABA问题解决方案是一个std::size_t类型的tag+指针,但不是全部平台都支持。





解决方案2

文件tagged_ptr_ptrcompression.hpp

简化代码

#if defined (__x86_64__) || defined (_M_X64)
class tagged_ptr
{
typedef boost::uint64_t compressed_ptr_t; public:
typedef boost::uint16_t tag_t; private:
union cast_unit
{
compressed_ptr_t value;
tag_t tag[4];
}; static const int tag_index = 3;
static const compressed_ptr_t ptr_mask = 0xffffffffffffUL; //(1L<<48L)-1;
......
} #else
#error unsupported platform
#endif

早期X86-64处理器不支持cmpxchg16b指令

在X86-64平台上,48位是地址,剩下的16位是ABA预防tag

代码

static const compressed_ptr_t ptr_mask = 0xffffffffffffUL; //(1L<<48L)-1;

0xffffffffffff二进制就是48个1。

tag就像一个版本,通过tag,线程能够知道操作的数据已经发生了变化。










Boost Lockfree的更多相关文章

  1. boost::lockfree::queue多线程读写实例

    最近的任务是写一个多线程的东西,就得接触多线程队列了,我反正是没学过分布式的,代码全凭感觉写出来的,不过运气好,代码能够work= = 话不多说,直接给代码吧,一个多消费者,多生产者的模式.假设我的任 ...

  2. boost::lockfree::spsc_queue

    #include <boost/thread/thread.hpp> #include <boost/lockfree/spsc_queue.hpp> #include < ...

  3. boost::lockfree::stack

    #include <boost/thread/thread.hpp> #include <boost/lockfree/stack.hpp> #include <iost ...

  4. boost::lockfree::queue

    #include <boost/thread/thread.hpp> #include <boost/lockfree/queue.hpp> #include <iost ...

  5. Boost lockfree deque 生产者与消费者多对多线程应用

    boost库中有一个boost::lockfree::queue类型的 队列,对于一般的需要队列的程序,其效率都算不错的了,下面使用一个用例来说明. 程序是一个典型的生产者与消费者的关系,都可以使用多 ...

  6. boost 无锁队列

    一哥们翻译的boost的无锁队列的官方文档 原文地址:http://blog.csdn.net/great3779/article/details/8765103 Boost_1_53_0终于迎来了久 ...

  7. 极客时间-左耳听风-程序员攻略-异步I/O模型和Lock-Free编程

    异步 I/O 模型 异步 I/O 模型其中的设计模式或是解决方法可以借鉴到分布式架构上来. 史蒂文斯(Stevens)在<UNIX 网络编程>一书 6.2 I/O Models 中介绍了五 ...

  8. lockfree buffer test

    性能测试(3): 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试     版权声明:本文为博主zieckey原创文章, ...

  9. Boost无锁队列

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/okiwilldoit/article/details/50970408 在开发接收转发agent时, ...

随机推荐

  1. Apple Watch 1.0 开发介绍 1.3 简介 WatchKit App 架构

    WatchKit app和WatchKit extension一起实现了app的界面.当用户在Apple Watch中操作时,WatchKit app从storyboards中选择合适的场景.比如,如 ...

  2. 【Android基础】listview控件的使用(1)------最简单的listview的使用

    listview控件是项目开发中最常用的空间之一,我将慢慢推出关于listview的一系列的文章,先从最简单的,系统自带的listview开始吧! 先上效果图: activity_one.xml &l ...

  3. Java的λ表达(lambda)

    λ表达的基本目的 回调Java8的λ表达式 说明了Java8的λ表达式的基本用途:完毕了回调的原意--代码的參数化. 回调:能够简单地说,假设你的方法须要override底层或JDK的某个类的方法,并 ...

  4. OpenCV——Delaunay三角 [转载]

    从这个博客转载 http://blog.csdn.net/raby_gyl/article/details/17409717 请其它同学转载时注明原始文章的出处! Delaunay三角剖分是1934年 ...

  5. 懵懵懂懂初识J2EE

    一.定义 Java2平台包含:标准版.企业版.微缩版.当中J2SE是Java2的标准版,主要用 于桌面应用软件的编程:J2ME是微缩版,主要应用于嵌入式系统开发:还有这次学习的J2EE是Java2的企 ...

  6. 关于.NET,.NET Framework 和ASP.NET的总结

    .NET 1.1.        .NET是 Microsoft XML Web services 平台和技术. 1.2.        一个.NET应用是一个运行于.NET Framework之上的 ...

  7. 视频和音频播放的演示最简单的例子6:OpenGL广播YUV420P(T经exture,采用Shader)

    ===================================================== 最简单的视频和音频播放的演示样品系列列表: 最简单的视音频播放演示样例1:总述 最简单的视音 ...

  8. Cocos观察者设计模式和通报机制

    观察员(Observer)模式也称为公告/订阅(Publish/Subscribe)模式.这是 MVC( 模型-视图-控制器)模型的重要组成部分.天气一直讨论的英国最喜欢的话题,近期天气变化几年已成为 ...

  9. XCL-Charts画一个图(CurveChart)

    情节线图与往常不同的是,它是一个比较特殊线位置计算.所以我得到一个单独的类.相同.只需要输入数据源的基类, 加,控制要添加的.你可以画出你自己主动设置按照预期的效果. 代码: //图基类 chart ...

  10. Android中部署自己的su

    本人博客原文 首先把你的自己的su的放到Android应用程序project的assets文件夹,为了和系统的su区分,我自己的su文件叫做sur. 另外我这里没有考虑x86架构的cpu的手机. 废话 ...