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

woaidongmao

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

用匯編實現原子操作

 

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

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

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

80486 CPU相關指令:

LOCK:這是一個指令前綴,在所對應的指令操作期間使此指令的目標操作數指定的存儲區域鎖定,以得到保護。

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

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

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

80486以上都支持這四個操作,因此當今幾乎100%CPU都支持這兩個指令,也能由此用標準CC++寫出一系列幾乎可以跨平臺的原子操作函數和Lock-Free數據結構和算法.

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

原子操作函數:

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

比較后交換

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位的數據類型有4,但是上面的只支持long,怎么辦?手工hack?太土了,當然是C++的大規模殺傷性武器template.

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

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

#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) - 原子數類

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

一切細節看源碼中穿插的注釋.

#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來保證是位的整數類型

   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){//??? 這里留給大家,我不給出源碼了

   }

   //需要這么一個轉型符號,因為大部分時候我們將atomic_value32<T>當作一個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與之對應,就直接拿出來了

   T compare_exchange(T to_exchange, T to_compare)

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

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

   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 肥仔 閱讀(8417) 評論(1)  編輯 收藏 引用 所屬分類: C++ 基礎

評論

# re: 用匯編實現原子操作  回復  更多評論   

推薦文章:[url=http://cjjjs.cn/windows/12342320121020.aspx]原子操作與互斥訪問關系分析 [/url]
推薦理由:主要講解原子操作的原理和實現過程,借鑒了數據庫系統的事務來分析。
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>
            欧美11—12娇小xxxx| 好吊妞**欧美| 99国产欧美久久久精品| 免费看亚洲片| 久久久人人人| 亚洲国产精品女人久久久| 欧美第十八页| 先锋a资源在线看亚洲| 欧美午夜电影一区| 在线亚洲激情| 亚洲天堂成人在线观看| 国产精品久久久久久久久搜平片| 亚洲午夜精品福利| 亚洲视屏一区| 黄色av一区| 欧美激情一二三区| 欧美日韩国产区一| 欧美一区二区三区视频在线观看 | 亚洲精品色图| 久久精品72免费观看| 亚洲校园激情| 狠狠色丁香久久综合频道| 欧美成年人在线观看| 欧美激情亚洲| 香蕉国产精品偷在线观看不卡| 亚洲靠逼com| 国产精品草草| 久久欧美中文字幕| 欧美v亚洲v综合ⅴ国产v| 中文欧美在线视频| 一本色道久久综合亚洲精品婷婷| 亚洲视频一区二区| 欧美理论在线播放| 久久综合久久美利坚合众国| 国产精品伊人日日| 在线亚洲一区二区| 中文av字幕一区| 久久人人九九| 久久精品网址| 在线精品视频一区二区三四| 久久精品久久99精品久久| 国内精品久久久久久| 亚洲欧美日韩国产综合| 久久久久国产一区二区| 在线视频亚洲一区| 久久亚洲精品伦理| 亚洲欧美资源在线| 老司机凹凸av亚洲导航| 亚洲午夜伦理| 狼人天天伊人久久| 先锋影音网一区二区| 欧美精品一区在线发布| 久久免费视频一区| 国产九九精品视频| 一区二区欧美激情| 亚洲免费电影在线| 亚洲理论在线观看| 久久久久久999| 欧美三级日本三级少妇99| 欧美va天堂在线| 国产日韩欧美精品在线| 夜夜嗨av一区二区三区| 国产欧美一区二区三区另类精品| 亚洲激情网址| 国产综合视频在线观看| 亚洲午夜精品一区二区| 亚洲一区二区三| 欧美日韩第一区日日骚| 亚洲激情国产精品| 亚洲精品资源美女情侣酒店| 久久综合影视| 欧美护士18xxxxhd| 亚洲国内在线| 欧美激情综合亚洲一二区| 欧美激情国产日韩| 亚洲精品一区二区三区蜜桃久| 美女视频网站黄色亚洲| 蜜桃久久精品乱码一区二区| 精品电影一区| 久久久噜噜噜久久中文字免| 欧美成人免费在线观看| 伊人精品久久久久7777| 午夜激情综合网| 久久久精品网| 亚洲电影免费在线| 欧美理论大片| 一本色道久久88亚洲综合88| 99精品国产在热久久| 欧美日韩国产欧美日美国产精品| 亚洲精选一区二区| 国产无遮挡一区二区三区毛片日本| 欧美激情一区二区三区不卡| 日韩视频免费观看| 欧美极品影院| 亚洲精品在线观| 亚洲色图自拍| 亚洲欧洲在线视频| 国产午夜精品久久久| 亚洲精品孕妇| 亚洲黄网站在线观看| 影院欧美亚洲| 在线精品国产成人综合| 免费成人在线观看视频| 美女视频黄免费的久久| 欧美丰满高潮xxxx喷水动漫| 欧美一区二区精品在线| 小嫩嫩精品导航| 久久青草欧美一区二区三区| 校园春色国产精品| 久久人人爽爽爽人久久久| 在线看日韩欧美| 欧美国产大片| 一区二区欧美日韩| 日韩视频在线观看免费| 国产精品久久久久久久久久尿| 99视频在线观看一区三区| 亚洲一区二区三区三| 国产美女扒开尿口久久久| 久久国产一区二区| 亚洲黄一区二区三区| 亚洲欧美日韩一区二区三区在线| 国产精品一区一区| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲伦理精品| 久久精品国产清高在天天线 | 久久精品中文| 亚洲区欧美区| 午夜欧美精品| 日韩一级裸体免费视频| 久久久久久久97| 国产一区二区三区久久久| 一区二区三区成人| 国产精品亚洲人在线观看| 国产日本欧美在线观看 | 久久另类ts人妖一区二区| 欧美日韩一二三四五区| 正在播放亚洲一区| 欧美韩国在线| 久久久久欧美精品| 亚洲午夜免费福利视频| 国产一区二区三区免费在线观看| 欧美久久在线| 久久精品在线| 亚洲欧美综合网| aa亚洲婷婷| 欧美激情网站在线观看| 久久综合一区| 欧美一区二区三区日韩| 亚洲视屏在线播放| 亚洲视频在线看| 亚洲精品五月天| 在线免费不卡视频| 国产日韩一区欧美| 欧美特黄一区| 久久夜色精品国产亚洲aⅴ| 国一区二区在线观看| 久久久噜噜噜久噜久久| 国产色婷婷国产综合在线理论片a| 久久香蕉国产线看观看av| 欧美专区在线播放| 亚洲日本中文字幕免费在线不卡| 亚洲激情自拍| 国产免费成人| 亚洲国产精品精华液2区45| 欧美色图首页| 欧美激情黄色片| 国产一区二区三区四区| 亚洲欧美制服中文字幕| 亚洲精选在线观看| 久久精品二区三区| 亚洲欧美一区二区原创| 亚洲欧美色一区| 午夜精品一区二区三区在线播放 | 一本色道久久88综合亚洲精品ⅰ| 日韩视频免费看| 国产女主播一区二区| 国产区精品视频| 狠狠色综合网| 狠狠综合久久| 国产欧美一区视频| 亚洲欧洲精品一区二区精品久久久 | 美女精品一区| 欧美成人综合网站| 欧美成人资源| 猛男gaygay欧美视频| 欧美国产日韩一区二区在线观看 | 亚洲久色影视| 亚洲视频精品在线| 夜夜嗨av一区二区三区中文字幕| 日韩一级在线| 久久精品成人欧美大片古装| 久久九九精品99国产精品| 久久综合99re88久久爱| 亚洲国产精品成人综合| 亚洲高清在线观看一区| 美女在线一区二区| 在线视频你懂得一区| 久久精品一二三区| 免费亚洲电影| 国产精品一区在线播放|