仿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),不禁又有一种激动. 源码阅读,我 ...
随机推荐
- jQuery中给动态添加的元素绑定事件
$(document).on(event,selector,function(){ //do somethimg here! });
- smartupload 上传与下载(转载)
前台: <form action="uploadimage.jsp" method="post" enctype="multipart/form ...
- 02、AngularJs的数据绑定
我们知道,AngularJs中的数据绑定是双向绑定的,View的改变,会改变Model,Model的改变也会改变View中的值,废话不多说,我们直接上代码. <!DOCTYPE html> ...
- maven创建 web项目
Maven教程初级篇03: 创建Web应用 1. 使用如下命令创建Web应用: 代码 mvn archetype:generate -DgroupId=net.jianxi.tutorials.mav ...
- Link To Sql简单
Linq及其扩展 Linq是一种数据查询语言(它能够从多种数据源中查询数据). 现在基于Linq的扩展有: Linq To Object:主要是从内存对象中查询数据 Linq To Sql:主要是从M ...
- Yii2中的入口文件环境配置
默认的Debug配置 在入口文件中 defined ( 'YII_DEBUG' ) or define ( 'YII_DEBUG', true ); defined ( 'YII_ENV' ) or ...
- Amazon RDS MySQL数据库还原时 log_bin_trust_function_creators 错误解决办法
使用了Amazon AWS EC2免费云空间,数据库实例采用Amazon RDS.原来在Windows Server上有一个存在大量数据的MySQL数据库.现在需要在Amazon RDS上还原这个My ...
- Restful.Data v1.0 - 轻量级数据持久层组件, 正式开源发布了
经过几个星期的优化调整,今天 Restful.Data 正式开源发布. 源码地址:https://github.com/linli8/Restful 今天不写那么多废话了,还是重新介绍一下 Restf ...
- 弹层,iframe页面
前台页面: <img src="chb/老玩家 好礼送.jpg" border="0" width="202" height=&quo ...
- javascript 设计模式-----外观模式
外观模式是为外部提供简单的接口一种方式,由于模块内部方法庞杂,不能一一对外公开,那么我们需要一个统一的和简单的对外方法(API)来调用这些内在的函数.这时候我们可以用到外观模式: var module ...