青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數(shù)據(jù)加載中……

用匯編實現(xiàn)原子操作

 

原子操作(1) - 用匯編實現(xiàn)原子操作

最輕量級的鎖”,通常也叫原子操作”,之所以加引號是因為他們在匯編級別并不是原子操作,是用多條指令完成的,這些操作大多都是利用CPU支持的匯編指令.在某些構(gòu)架過時的CPU體系結(jié)構(gòu)上,它們應(yīng)該是用比較重量級的線程內(nèi)鎖實現(xiàn)的吧(我的猜測).

最常見的原子操作有Compare and Exchange,Self Increase/Decrease等等

80486 CPU相關(guān)指令:

LOCK:這是一個指令前綴,在所對應(yīng)的指令操作期間使此指令的目標(biāo)操作數(shù)指定的存儲區(qū)域鎖定,以得到保護。

XADD:先交換兩個操作數(shù)的值,再進行算術(shù)加法操作。多處理器安全,在80486及以上CPU中支持。

CMPXCHG:比較交換指令,第一操作數(shù)先和AL/AX/EAX比較,如果相等ZF1,第二操作數(shù)賦給第一操作數(shù),否則ZF0,第一操作數(shù)賦給AL/AX/EAX。多處理器安全,在80486及以上CPU中支持。

XCHG:交換兩個操作數(shù),其中至少有一個是寄存器尋址.其他寄存器和標(biāo)志位不受影響.

80486以上都支持這四個操作,因此當(dāng)今幾乎100%CPU都支持這兩個指令,也能由此用標(biāo)準(zhǔn)CC++寫出一系列幾乎可以跨平臺的原子操作函數(shù)和Lock-Free數(shù)據(jù)結(jié)構(gòu)和算法.

64位平臺也有一系列的相關(guān)指令,當(dāng)然他們也有以上提到的指令,其下的64位原子操作函數(shù)應(yīng)該和32位的分開(要問為什么?我現(xiàn)在告訴你恐怕你印象不深,接著看這一系列吧),而道理完全一樣.因此,不存在跨CPU體系結(jié)構(gòu)的問題)

原子操作函數(shù):

由以上提供的幾個匯編指令,我們可以做出以下實現(xiàn),這些都是最常用的原語.

比較后交換

long __stdcall CompareExchange(long volatile*Destination,long Exchange,long Comperand)

{

   __asm

   {

      mov     ecx, Destination;

      mov     edx, Exchange;

      mov     eax, Comperand;

      lock cmpxchg [ecx], edx;

   }

}

交換

long __stdcall Exchange(long volatile* Target,long Value)

{

   __asm

   {

      mov      ecx, Target;

      mov      edx, Value;

label:

      lock cmpxchg [ecx], edx;//

      jnz      short label;

   }

}

自減

long __stdcall Decrement(long volatile* Addend)

{

   __asm

   {

      mov     ecx, Addend;

      mov     eax, 0FFFFFFFFh;//-1

      lock xadd [ecx], eax; //-1

      dec     eax;

   }

}

自增

long __stdcall Increment(long volatile* Addend)

{

   __asm

   {

      mov      ecx, Addend;

      mov      eax, 1;

      lock xadd [ecx], eax; //

      inc      eax;

   }

}

相加后交換

long __stdcall ExchangeAdd(long volatile* Addend,long Value)

{

   __asm

   {

      mov      ecx, Addend;

      mov      eax, Value;

      lock xadd [ecx], eax;

   }

}

 

原子操作(2) - 泛型后的原子操作

32位的數(shù)據(jù)類型有4,但是上面的只支持long,怎么辦?手工hack?太土了,當(dāng)然是C++的大規(guī)模殺傷性武器template.

同時把幾個不跨平臺的地方抽出來用macro表示.

目前模板還沒有得到concept的支持,所以只能用boost.type_traits低級的手動判斷,要求只有32位的整數(shù)類型才能實例化這些函數(shù).

#include

#include

#define CALL_METHOD __stdcall

#define VOLATILE volatile

template<typename T>

T CALL_METHOD compare_exchange32(T VOLATILE*Destination,T exchange32,T Comperand)

{

   BOOST_STATIC_ASSERT(sizeof(T) == 4 && boost::is_integral<T>::value);

   __asm

   {

      mov     ecx, Destination;

      mov     edx, exchange32;

      mov     eax, Comperand;

      lock cmpxchg [ecx], edx;

   }

}

template<typename T>

T CALL_METHOD exchange32(T VOLATILE* Target,T Value)

{

   BOOST_STATIC_ASSERT(sizeof(T) == 4 && boost::is_integral<T>::value);

   __asm

   {

      //     mov    ecx, Target;

      //     mov    edx, Value;      

      //label:

      //     lock   cmpxchg [ecx], edx;//

      //     jnz    short label;

      mov      ecx, Target;

      mov      eax, Value;

      xchg [ecx],eax;

   }

}

template<typename T>

T CALL_METHOD decrement32(T VOLATILE* Addend)

{

   BOOST_STATIC_ASSERT(sizeof(T) == 4 && boost::is_integral<T>::value);

   __asm

   {

      mov     ecx, Addend;

      mov    eax, 0FFFFFFFFh;//-1

      lock xadd [ecx], eax; //-1

      dec     eax;

   }

}

template<typename T>

T CALL_METHOD increment32(T VOLATILE* Addend)

{

   BOOST_STATIC_ASSERT(sizeof(T) == 4 && boost::is_integral<T>::value);

   __asm

   {

      mov      ecx, Addend;

      mov      eax, 1;

      lock xadd [ecx], eax; //

      inc      eax;

   }

}

template<typename T>

T CALL_METHOD exchange_add32(T VOLATILE* Addend,T Value)

{

   BOOST_STATIC_ASSERT(sizeof(T) == 4 && boost::is_integral<T>::value);

   __asm

   {

      mov      ecx, Addend;

      mov      eax, Value;

      lock xadd [ecx], eax;

   }

}

原子操作(3) - 原子數(shù)類

根據(jù)上面的5個函數(shù)就能做出一個原子操作的整數(shù)數(shù)字類,這將是下一節(jié)中,我的最輕量級鎖的基礎(chǔ)和原型,他不依賴于操作系統(tǒng),當(dāng)然,所以你也可以不叫他是鎖,只是一種類似鎖的機制.

一切細節(jié)看源碼中穿插的注釋.

#ifndef __ATOM_VALUE_H__

#define __ATOM_VALUE_H__

#include "atom.hpp"

#include <boost/static_assert.hpp>

#include <boost/type_traits.hpp>

template<typename T>

class atomic_value32

{

   //,boost.type_traits來保證是位的整數(shù)類型

   BOOST_STATIC_ASSERT(sizeof(T) == 4 && boost::is_integral<T>::value);

private:

   volatile T value_;

public:

   atomic_value32(T v = 0)

      :value_(v){}

   atomic_value32(atomic_value32& v){//??? 這里留給大家,我不給出源碼了

   }

   //需要這么一個轉(zhuǎn)型符號,因為大部分時候我們將atomic_value32<T>當(dāng)作一個T使用

   operator T(){return exchange_add32(&value_,0);}

   //賦值

   atomic_value32& operator=(T v){exchange32(&value_, v);return *this;}

   atomic_value32& operator=(atomic_value32& v){exchange32(&value_, v);return *this;}

   //比較并交換,好像沒有什么operator與之對應(yīng),就直接拿出來了

   T compare_exchange(T to_exchange, T to_compare)

   {return compare_exchange32<T>(&value_, to_exchange, to_compare);}

   //只提供前置,后置似乎沒什么必要,我也懶得去實現(xiàn)了:)

   T operator++(){return increment32(&value_);}

   T operator--(){return decrement32(&value_);}

   //千萬不能返回引用,因為線程安全考慮,

   T operator+=(T add){return exchange_add32(&value_,add);}

   T operator+=(atomic_value32& add){return exchange_add32(&value_,add);}

   T operator-=(T add){return exchange_add32(&value_,-add);}

   T operator-=(atomic_value32& add){return exchange_add32(&value_,-add);}

   //6個比較符號

   bool operator==(T rhs){return operator T()==rhs;}

   bool operator==(atomic_value32& rhs){return operator T()==rhs.operator T();}

   bool operator<(T rhs){return operator T()<rhs;}

   bool operator<(atomic_value32& rhs){return operator T()<rhs.operator T();}

   bool operator!=(T rhs){return !this->operator ==(rhs);}

   bool operator!=(atomic_value32& rhs){return !this->operator ==(rhs);}

   bool operator>=(T rhs){return !this->operator <(rhs);}

   bool operator>=(atomic_value32& rhs){return !this->operator <(rhs);}

   bool operator>(T rhs){return ((*this)!=(rhs)) && !((*this)<(rhs));}

   bool operator>(atomic_value32& rhs){return ((*this)!=(rhs)) && !((*this)<(rhs));}

   bool operator<=(T rhs){return !((*this)>(rhs));}

   bool operator<=(atomic_value32& rhs){return !((*this)>(rhs));}

};

#endif//__ATOM_VALUE_H__

posted on 2009-10-19 18:45 肥仔 閱讀(8409) 評論(1)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)

評論

# re: 用匯編實現(xiàn)原子操作  回復(fù)  更多評論   

推薦文章:[url=http://cjjjs.cn/windows/12342320121020.aspx]原子操作與互斥訪問關(guān)系分析 [/url]
推薦理由:主要講解原子操作的原理和實現(xiàn)過程,借鑒了數(shù)據(jù)庫系統(tǒng)的事務(wù)來分析。
2014-12-23 15:00 | wd
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线看无码的免费网站| 欧美粗暴jizz性欧美20| 久久一区中文字幕| 小黄鸭精品密入口导航| 久久www免费人成看片高清| 欧美在线视频一区| 噜噜噜躁狠狠躁狠狠精品视频| 久久一区二区三区国产精品| 欧美福利在线观看| 日韩一区二区免费高清| 亚洲在线一区二区三区| 欧美伊人久久| 欧美激情视频在线免费观看 欧美视频免费一| 欧美成人资源网| 亚洲精品一二| 欧美一区二区三区四区在线| 亚洲第一色中文字幕| 亚洲国产美女精品久久久久∴| 亚洲成人资源| 亚洲自拍三区| 麻豆免费精品视频| 国产精品久久久久久久电影| 国产在线国偷精品产拍免费yy| 亚洲精品你懂的| 性欧美8khd高清极品| 欧美寡妇偷汉性猛交| 亚洲一区国产一区| 欧美大香线蕉线伊人久久国产精品| 欧美午夜精品久久久久久孕妇 | 国产日韩视频一区二区三区| 伊人狠狠色j香婷婷综合| 99国产精品99久久久久久粉嫩| 欧美一区二区免费观在线| 亚洲成人自拍视频| 久久精品国亚洲| 欧美色道久久88综合亚洲精品| 在线欧美影院| 久久久精品2019中文字幕神马| 亚洲精品美女| 免费在线亚洲| 在线播放豆国产99亚洲| 欧美一区在线视频| 一区二区三区产品免费精品久久75| 久久综合中文色婷婷| 国产尤物精品| 久久精品视频在线| 午夜免费日韩视频| 国产女人aaa级久久久级| 亚洲亚洲精品在线观看| 亚洲欧洲中文日韩久久av乱码| 久久综合国产精品| 在线不卡中文字幕播放| 久久久久久午夜| 久久不见久久见免费视频1| 国产精品日韩久久久久| 亚洲欧美日本日韩| 一本色道久久| 国产精品成人aaaaa网站| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 午夜精品福利一区二区三区av| 亚洲区中文字幕| 欧美激情视频在线播放| 美女免费视频一区| 亚洲国产成人不卡| 欧美激情第三页| 欧美电影免费观看| 日韩视频一区二区三区在线播放| 欧美高清视频www夜色资源网| 久久亚洲精品视频| 亚洲国产日韩综合一区| 亚洲电影在线播放| 欧美日韩高清不卡| 亚洲综合精品| 欧美在线观看日本一区| 韩国一区二区三区在线观看| 久久中文字幕导航| 久久综合久久综合久久| 亚洲伦理自拍| 亚洲图片自拍偷拍| 国产私拍一区| 欧美成人黄色小视频| 欧美精品成人在线| 欧美一级精品大片| 久久综合狠狠综合久久综合88| 亚洲三级性片| 亚洲欧美视频在线观看| 一区二区三区在线观看视频| 欧美成人激情在线| 国产精品国产三级国产专区53| 久久精选视频| 欧美激情性爽国产精品17p| 午夜精品一区二区三区电影天堂| 欧美一区二区在线观看| 日韩视频在线你懂得| 亚洲欧美日韩一区| 一本色道久久88综合亚洲精品ⅰ | 久久精品免费播放| 国产精品99久久久久久人| 欧美一级免费视频| 一区二区三区成人| 久久精品国产欧美激情| 一区二区免费在线视频| 久久精品日韩| 午夜国产精品影院在线观看| 榴莲视频成人在线观看| 亚洲欧美一区二区激情| 蜜桃伊人久久| 久久久久欧美精品| 国产精品久久波多野结衣| 欧美电影资源| 国产亚洲视频在线观看| 日韩亚洲国产欧美| 亚洲激情偷拍| 久久精品成人欧美大片古装| 亚洲天堂偷拍| 欧美激情导航| 嫩草影视亚洲| 国产亚洲视频在线观看| 亚洲一区二区欧美| 亚洲天堂av电影| 欧美日本不卡| 亚洲人成网站在线播| 91久久综合| 亚洲电影在线看| 精品成人在线| 欧美综合国产| 久久精品国产在热久久 | 国产欧美精品va在线观看| 亚洲精品美女免费| 亚洲精品小视频在线观看| 久久亚洲精品中文字幕冲田杏梨| 欧美在线三级| 国产欧美日韩视频一区二区三区 | 亚洲第一精品夜夜躁人人爽| 激情久久影院| 久久影院午夜片一区| 老**午夜毛片一区二区三区| 国产偷自视频区视频一区二区| 亚洲一本视频| 欧美一区二区三区喷汁尤物| 国产精品视频xxxx| 午夜亚洲一区| 狼狼综合久久久久综合网 | 欧美伊人久久久久久午夜久久久久 | 欧美日精品一区视频| 亚洲精品无人区| 亚洲一本视频| 国产夜色精品一区二区av| 欧美一区二区视频在线观看| 久久影视三级福利片| 亚洲国产精品久久久久婷婷老年 | 欧美sm极限捆绑bd| 日韩视频中文字幕| 香蕉成人伊视频在线观看| 国产精品你懂的| 欧美在线精品一区| 亚洲福利视频一区| 亚洲一区欧美二区| 国产亚洲毛片在线| 久久综合给合久久狠狠狠97色69| 亚洲国产天堂久久国产91| 99精品欧美一区二区三区 | 亚洲老司机av| 欧美视频亚洲视频| 欧美一区二区三区视频免费| 免费在线亚洲欧美| 在线一区二区视频| 国内在线观看一区二区三区| 免费观看不卡av| 亚洲视频精选| 欧美va亚洲va香蕉在线| 一区二区三区日韩精品| 国产日韩av一区二区| 欧美高潮视频| 香蕉久久一区二区不卡无毒影院| 欧美高清你懂得| 久久成人18免费网站| 欧美日韩国产欧| 亚洲欧美精品在线观看| 欧美激情视频一区二区三区在线播放 | 久久只有精品| 亚洲一区国产视频| 在线观看亚洲a| 国产精品va在线播放| 久久riav二区三区| 在线中文字幕日韩| 欧美激情精品久久久久| 午夜精品久久久久久久99黑人| 亚洲国产精品久久久久秋霞蜜臀| 国产精品一区免费观看| 欧美日韩免费一区| 蜜臀久久久99精品久久久久久 | 日韩一二三在线视频播| 玖玖玖国产精品| 欧美亚洲日本国产| 一区二区三区精品视频在线观看| 亚洲成人自拍视频| 国模大胆一区二区三区| 国产精品亚洲一区| 国产精品v片在线观看不卡|