仿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),不禁又有一种激动. 源码阅读,我 ...
随机推荐
- berkeley db中 dirty read的实现
dirty reader怎样 不被writor block住? 如数据库支持dirty read, 则 所有打开的dbhandle都配置 DB_READ_UNCOMMITTED; 在线程拿到 writ ...
- 利用CSS3实现圆角的outline效果的教程
一.首先,outline是个很牛的东西1. border近亲outline和border是近亲,为什么这么讲呢?首先,都是给元素外面套框框的:其次,支持的属性值几乎都是一样的,例如,outline-s ...
- 界面显示两个ListView
1.List界面布局 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:an ...
- C++ 非阻塞套接字的使用 (3)
异步非阻塞套接字避免了死循环的接收问题,但是软件用起来体验还是很差.究其原因,软件在指令的发送.接收上, 采取了一种不合理的方式:在指令的发送后,立刻调用接收函数,等待回令. 若是采用同步阻塞套接字, ...
- 【转载】CentOS6.5_X64下安装配置MongoDB数据库
[转载]CentOS6.5_X64下安装配置MongoDB数据库 2014-05-16 10:07:09| 分类: 默认分类|举报|字号 订阅 下载LOFTER客户端 本文转载自zhm&l ...
- phpcms v9 标签含义整理
{template "content","header"} ---------- 调用根目录下phpcms\template\content\header ...
- 原来在linux上切换jdk的版本是这么简单
上次在linux上切换jdk版本的时候,还配置了半天的环境变量,今天又查了一下,原来是这么的简单 1. 查看相应的jdk是否在 ubuntu的jdk菜单里,查看: (输全哦) update-alter ...
- Java使用velocity导出word
效果展示: 使用word编辑好模板
- ZabbixCPU温度监视-windows2008R2
1, speed-fan安装 SpeedFan - Access temperature sensor in your computer / http://www.almico.com/speedfa ...
- [ASE]sprint2 总结 & sprint3计划
第二个sprint半圆满的结束了, 经历了四周之后我们将整个的框架搭建好,并且能够正常的游戏对战,破坏场景,聊天…… 但是正如老师所述,缺乏亮点. 不过大家都是第一次做,完全把他当成一个工程来一点一点 ...