linux無鎖化編程--__sync_fetch_and_add系列原子操做函數

linux支持的哪些操做是具備原子特性的?知道這些東西是理解和設計無鎖化編程算法的基礎。linux

下面的東西整理自網絡。先感謝你們的分享!算法

 

__sync_fetch_and_add系列的命令,發現這個系列命令講的最好的一篇文章,英文好的同窗能夠直接去看原文。Multithreaded simple data type access and atomic variables編程

__sync_fetch_and_add系列一共有十二個函數,有加/減/與/或/異或/等函數的原子性操做函數,__sync_fetch_and_add,顧名思義,先fetch,而後自加,返回的是自加之前的值。以count = 4爲例,調用__sync_fetch_and_add(&count,1),以後,返回值是4,而後,count變成了5.
有__sync_fetch_and_add,天然也就有__sync_add_and_fetch,呵呵這個的意思就很清楚了,先自加,在返回。他們哥倆的關係與i++和++i的關係是同樣的。被譚浩強他老人家收過保護費的都會清楚了。
有了這個寶貝函數,咱們就有新的解決辦法了。對於多線程對全局變量進行自加,咱們就不再用理線程鎖了。下面這行代碼,和上面被pthread_mutex保護的那行代碼做用是同樣的,並且也是線程安全的。安全

__sync_fetch_and_add( &global_int, 1 );
下面是這羣函數的全家福,你們看名字就知道是這些函數是幹啥的了。服務器

在用gcc編譯的時候要加上選項 -march=i686網絡

// sam:在個人服務器上,發現不加均可以。多線程


type __sync_fetch_and_add (type *ptr, type value);
type __sync_fetch_and_sub (type *ptr, type value);
type __sync_fetch_and_or (type *ptr, type value);
type __sync_fetch_and_and (type *ptr, type value);
type __sync_fetch_and_xor (type *ptr, type value);
type __sync_fetch_and_nand (type *ptr, type value);
type __sync_add_and_fetch (type *ptr, type value);
type __sync_sub_and_fetch (type *ptr, type value);
type __sync_or_and_fetch (type *ptr, type value);
type __sync_and_and_fetch (type *ptr, type value);
type __sync_xor_and_fetch (type *ptr, type value);
type __sync_nand_and_fetch (type *ptr, type value);函數

 

// sam:很納悶爲何後邊要寫省略號,是否是還有不須要咱們關心的參數?用的時候不須要傳參數?下面這兩個函數正是哥想要的啦,能夠輕鬆實現互斥鎖的功能。post

bool __sync_bool_compare_and_swap (type*ptr, type oldval, type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval,  type newval, ...)
這兩個函數提供原子的比較和交換,若是*ptr == oldval,就將newval寫入*ptr,
第一個函數在相等並寫入的狀況下返回true.
第二個函數在返回操做以前的值。fetch


__sync_synchronize (...)

理解上面這個東西,參照:http://blog.sunchangming.com/post/47188394133


還有兩個函數:
type __sync_lock_test_and_set (type *ptr, type value, ...)
將*ptr設爲value並返回*ptr操做以前的值。

void __sync_lock_release (type *ptr, ...)
將*ptr置0

相關文章
相關標籤/搜索