linux無鎖話程式設計,原子

2021-07-10 08:52:23 字數 2048 閱讀 4573

linux支援的哪些操作是具有原子特性的?知道這些東西是理解和設計無鎖化程式設計演算法的基礎。

下面的東西整理自網路。先感謝大家的分享!

__sync_fetch_and_add系列的命令,發現這個系列命令講的最好的一篇文章,英文好的同學可以直接去看原文。multithreaded ****** 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:很納悶為什麼後邊要寫省略號,是不是還有不需要我們關心的引數?用的時候不需要傳引數?下面這兩個函式正是哥想要的啦,可以輕鬆實現互斥鎖的功能。

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.

第二個函式在返回操作之前的值。

__sync_synchronize (...)

理解上面這個東西,參照:

還有兩個函式:

type __sync_lock_test_and_set (type *ptr, type value, ...)

將*ptr設為value並返回*ptr操作之前的值。

void __sync_lock_release (type *ptr, ...)

將*ptr置0

Linux核心無鎖程式設計

多核多執行緒已經成為當下乙個時髦的話題,而無鎖程式設計更是這個時髦話題中的熱點話題。linux核心可能是當今最大最複雜的並行程式之一,為我們分析多核多執行緒提供了絕佳的範例。核心設計者已經將最新的無鎖程式設計技術帶進了2。6系統核心中,本文以2。6。10版本為藍本,帶領您領略多核多執行緒程式設計的真...

無鎖工具類 原子類

累加器例子 add10k 這個方法不是執行緒安全的,問題就出在變數 count 的可見性和 count 1 的原子性上 1.可見性問題可以用 volatile 來解決,2.原子性問題我一直都是採用的互斥鎖。public class test 對於簡單的原子性問題,還有一種無鎖方案 1.將原來的 lo...

鎖 無鎖 多處理器程式設計 2 原子操作

原子操作是不可分割的操作,在執行完畢時它不會被任何事件中斷,原子操作是多數無鎖程式設計的基本前提。atomic是原子的意思,意味 不可分割 的整體。在linux kernel中有一類atomic操作api。這些操作對使用者而言是原子執行的,在乙個cpu上執行過程中,不會被其他cpu打斷。最常見的操作...