仿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),不禁又有一种激动. 源码阅读,我 ...
随机推荐
- NYOJ 737 石子合并(一)
分析: 本题为区间型动态规划,dp[i][j] 表示从第 i 堆合并到第 j 堆的最小代价, sum[i][i] 表示第 i 堆到第 j 堆的石子总和,则动态转移方程: dp[i][j] = min( ...
- JS——树形导航菜单(html的ul嵌套,jQuery的css(),show(),hide(),index()等方法)
必备工具:jquery库文件.我这里用的是1.4版本的. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- "微空间"免费空间很棒哦,很适合中小网站站长
“微空间”(www.idcbt.com)是最长久的免费云主机 现在在站长圈子里面非常火爆的“微空间”免费空间网(www.idcbt.com)犹如火山爆发一样,瞬间成为了广大站长津津乐道的免费主机空间. ...
- mobaxterm ssh command
ssh -qTfnNg -D 7070 demouser@echo.supportedns.com -p 2233
- 对文本行进行排序,新增-d(目录排序),只对字母数字空格排序(TCPL 练习5-16)
文本行的排序用到了命令行参数以及多级指针,在要求只对字母数字空格进行排序时,关键的问题点是兼容-f命令参数,也就是排序的同时忽略大小写.由于在之前的练习中,我将忽略大小写的比较方法重新写了一个函数tr ...
- php+redis window
http://download.csdn.net/detail/qwfy326/6572443 wampserver2.2e-php5.3.13-httpd2.2.22-mysql5.5.24-x64
- 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel
5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 —— 第一天 认识Parallel 5天玩转C#并行和多线程编程 —— 第二天 并行集合和PLinq 5天玩转C#并行和多线程编 ...
- FusionCharts简单教程(五)-----FusionCharts中的那些特殊符号
在FusionCharts中有些特殊字符,我们需要进行编码操作才能够使用,否则就无法正常显示. 欧元符号 在FusionCharts里显示"€",你需要用 ...
- java那些小事---用偶数做判断,不要用基数做判断
今天做项目遇到这样一个奇葩问题:我们先看如下代码: int ftcs = dealFtcs(ftcs); if(ftcs % 2 == 1){ //奇数 /* * 处理..... */ } ...
- 浅谈Excel开发:七 Excel 自定义任务窗体
前面花了三篇文章讲解了Excel中的UDF函数,RTD函数和异步UDF函数,这些都是Excel开发中的重中之重.本文现在开始接着第二篇文章的菜单系统开始讲解Excel中可供开发的界面元素,本文要讲解的 ...