Boost Lockfree
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的更多相关文章
- boost::lockfree::queue多线程读写实例
最近的任务是写一个多线程的东西,就得接触多线程队列了,我反正是没学过分布式的,代码全凭感觉写出来的,不过运气好,代码能够work= = 话不多说,直接给代码吧,一个多消费者,多生产者的模式.假设我的任 ...
- boost::lockfree::spsc_queue
#include <boost/thread/thread.hpp> #include <boost/lockfree/spsc_queue.hpp> #include < ...
- boost::lockfree::stack
#include <boost/thread/thread.hpp> #include <boost/lockfree/stack.hpp> #include <iost ...
- boost::lockfree::queue
#include <boost/thread/thread.hpp> #include <boost/lockfree/queue.hpp> #include <iost ...
- Boost lockfree deque 生产者与消费者多对多线程应用
boost库中有一个boost::lockfree::queue类型的 队列,对于一般的需要队列的程序,其效率都算不错的了,下面使用一个用例来说明. 程序是一个典型的生产者与消费者的关系,都可以使用多 ...
- boost 无锁队列
一哥们翻译的boost的无锁队列的官方文档 原文地址:http://blog.csdn.net/great3779/article/details/8765103 Boost_1_53_0终于迎来了久 ...
- 极客时间-左耳听风-程序员攻略-异步I/O模型和Lock-Free编程
异步 I/O 模型 异步 I/O 模型其中的设计模式或是解决方法可以借鉴到分布式架构上来. 史蒂文斯(Stevens)在<UNIX 网络编程>一书 6.2 I/O Models 中介绍了五 ...
- lockfree buffer test
性能测试(3): 对无锁队列boost::lockfree::queue和moodycamel::ConcurrentQueue做一个性能对比测试 版权声明:本文为博主zieckey原创文章, ...
- Boost无锁队列
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/okiwilldoit/article/details/50970408 在开发接收转发agent时, ...
随机推荐
- 白学jquery Mobile《构建跨平台APP:jQuery Mobile移动应用实战》连续7-电话问卷调查
[例7-3 文本编辑框创建一个简单的调查问卷] 01 <!DOCTYPEhtml> 02 <html> 03 <head> 04 ...
- 解决Fedora升级时nvidia显卡问题
升级到新版Fedora后登录不了gnome 小编最近升级了Fedora 20到21,结果就如之前从Fedora 19升级到20时类似,又出问题了.Fedora你到底行不行... gnome登录不了 ...
- 了解ASP.NET5 Web应用程序结构
本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ASP.NET 5 针对WEB编程引 ...
- paip.jdk1.4 1.5(5.0) 1.6(6.0) 7.0 8.0特点比较与不同
paip.jdk1.4 1.5(5.0) 1.6(6.0) 7.0 8.0特点比较与不同 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地 ...
- 在SSMS里查看TDS数据包内容
原文:在SSMS里查看TDS数据包内容 在SSMS里查看TDS数据包内容 摘抄自<SQLSERVER2012实施与管理实战指南> 要具体查看TDS数据库的内容,我们可以: 用NETWORK ...
- 阿里2015在线研发project师笔试题(部分)
今天lz去阿里的在线笔试打了一把酱油,因为lz的水平有限,时间太他么紧张了.以下把记下来的题给大家分享一下.选择题总共20道,前十题截了图,后面感觉太费时就没有再截了,凭记忆记下了两道.附加题都记录下 ...
- android 联系数据库
联系人数据库学习 2011-10-31(这是android2.3在接触db) 简单介绍 Android中联系人的信息都是存储在一个叫contacts2.db的数据库中.该数据库的路径是:/data/d ...
- RH133读书笔记(10)-Lab 10 Exploring Virtualization
Lab 10 Exploring Virtualization Goal: To explore the Xen virtualization environment and the creation ...
- 熟人UML
UML,全名Unified Modeling Language.模语言.它是软件和系统开发的标准建模语言.主要是以图形的方式对系统进行分析.设计. 同一时候,UML不是一个程序设计语言,也不是一个形式 ...
- 如何使用滑动菜单SlidingMenu?
左側滑: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvanVuaHVhaG91c2U=/font/5a6L5L2T/fontsize/400/fill/I ...