仿Java的AtomicMarkableReference的AtomicMarkablePointer(C++)
//@author: Zou Xiaohang
//@describe: this class is like AtomicMarkableReference which is in java concurrent package.
// remember the pointer is 32bits address
template<class Pointer>
class AtomicMarkablePointer{
private:
std::atomic<Pointer> ptr;
const int32_t Marked = 0x00000001;
const int32_t UnMraked = 0x00000000;
public:
explicit AtomicMarkablePointer(Pointer p, bool mark){
ptr.store((Pointer)((int32_t)p | (int32_t)mark));
}
AtomicMarkablePointer(const AtomicMarkablePointer &a){
ptr.store(a.ptr.load());
}
AtomicMarkablePointer operator = (const AtomicMarkablePointer &a){
if (*this != a){
ptr.store(a.ptr.load());
}
return *this;
}
Pointer getReference() const {
Pointer p = ptr.load();
return (bool)((int32_t)p & Marked) ? (Pointer)((int32_t)(p)& ~Marked) : p;
}
bool isMarked() const {
Pointer p = ptr.load();
return (bool)((int32_t)p & Marked);
}
Pointer get(bool &b) const {
Pointer p = ptr.load();
b = (bool)((int32_t)p & Marked);
return b ? (Pointer)((int32_t)(p)& ~Marked) : p;
}
bool compareAndSet(Pointer expectedPointer, Pointer newPointer,
bool expectedMark, bool newMark){
Pointer p = ptr.load();
bool b = (bool)((int32_t)p & Marked);
if (b == expectedMark){
expectedPointer = (Pointer)((int32_t)expectedPointer | (int32_t)b);
return ptr.compare_exchange_strong(expectedPointer, (Pointer)((int32_t)newPointer | (int32_t)newMark));
}
return false;
}
void set(Pointer newPointer, bool newMark){
newPointer = (Pointer)((int32_t)newPointer | (int32_t)newMark);
ptr.exchange(newPointer);
}
bool attemptMark(Pointer expectedPointer, bool newMark){
Pointer newPointer = (Pointer)((int32_t)expectedPointer | (int32_t)newMark);
expectedPointer = isMarked() ? (Pointer)((int32_t)expectedPointer | Marked) : expectedPointer;
return ptr.compare_exchange_strong(expectedPointer, newPointer);
}
/*void print()const{
std::cout << getReference() << " ";
std::cout << (isMarked() ? "Marked" : "UnMarked");
}*/
};
仿Java的AtomicMarkableReference的AtomicMarkablePointer(C++)的更多相关文章
- 如何阅读Java源码 阅读java的真实体会
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比 ...
- Java与C++面向对象不同点
首先面向对象的语言有哪些?JAVA.C++.C#等等.但是呢很多人认为C#和C++有关系,其实一点关系都是没有滴.C#是仿Java做的,很多人都说是假Java,因为C#和Java太像了比如C#也有st ...
- 转载java源代码阅读方法
刚才在论坛不经意间,看到有关源码阅读的),不禁又有一种激动. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧,如果你从来没有学过Java,或是任何一门编程语言 ...
- java.net.SocketException四大异常解决方案【转】
java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketExceptio ...
- 深入浅出Java并发包—原子类操作
我们知道,JDK1.5以后引入了并发包(java.util.concurrent)用于解决多CPU时代的并发问题,而并发包中的类大部分是基于Queue的并发类,Queue在大多数情况下使用了原子类(A ...
- 如何阅读Java源码
刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动.源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 说到技术基础,我打个比方吧, ...
- Android java.net.SocketException四大异常解决方案
java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketExceptio ...
- Java socket 说明 以及web 出现java.net.SocketException:(Connection reset或者Connectreset by peer:Socket write error)的解释
另外http://www.cnblogs.com/fengmk2/archive/2007/01/15/using-Socket.html可供参考 一Java socket 说明 所谓socket ...
- [收藏] Java源码阅读的真实体会
收藏自http://www.iteye.com/topic/1113732 刚才在论坛不经意间,看到有关源码阅读的帖子.回想自己前几年,阅读源码那种兴奋和成就感(1),不禁又有一种激动. 源码阅读,我 ...
随机推荐
- 介绍一些chrome 好用的插件和快捷键
1.AdBlock ★★★ 最受欢迎的Google 浏览器扩充功能,拥有超过8 百万位使用者!阻挡网路上所有的广告. 2.印象笔记 -剪裁 无需多说! 3.豆藤 Bean vine ★★★★ 豆瓣有此 ...
- PureCode--iOS--自定义UITableViewCell(含疑问)
纯代码编写的简单自定义UITableViewCell: 1.像处理普通视图一样处理Cell: clsTableViewCell.h: #import <UIKit/UIKit.h> @in ...
- ARCgis已知线裁剪已知面
经常遇到需要在ArcGIS中,根据已知线图层(要素)切分已知面图层(要素).经过研究,利用topology拓扑菜单中的construct features可以实现.具体如下 现有用线图层A.面图层B, ...
- 屏幕适配1(Android 增强版百分比布局库 为了适配而扩展)
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46767825: 本文出自:[张鸿洋的博客] 这篇博文写得太好了,让我很激动,分 ...
- docker pull certification error
export DOMAIN_NAME=<my-dtr-domain> echo -n | openssl s_client -showcerts -connect itapregistry ...
- 技术文档--studio技术文档
1.Google推出的毫无疑问,这个是它的最大优势,Android Stuido是Google推出,专门为Android“量身订做”的,是Google大力支持的一款基于IntelliJ IDEA改造的 ...
- NSData与其它类型的转换
NSString转换成NSData对象 NSData *xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding] ...
- Eclipse - Failed to load the JNI shared Library (JDK)
When I try opening Eclipse, a pop-up dialog states: Failed to load the JNI shared library "C:/J ...
- MVC与DWZ整合中部分问题的解决
1.错误提示距离太远 2.正确与错误时返回JSON(即:如何不出现打开新页显示JSON字串) 3.打开新页后“数据加载中,请稍候”关不掉 4.如何正常的分页,同时如果有查询结果时分页也要有效 5.关闭 ...
- 淘宝UWP--自定义图片缓存
一.应用场景 在淘宝应用首页,会有很多张图片,而这些首页图片不会经常改变,所以就需要缓存下来.这样就不必每次都从网络获取. 二.比较对象 1.系统缓存 对于系统缓存,我们不需要做什么处理.只需要把网络 ...