首頁  >  文章  >  運維  >  linux無鎖定的實例詳解

linux無鎖定的實例詳解

零下一度
零下一度原創
2017-07-03 15:47:451328瀏覽

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

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

sync_fetch_and_add系列的命令,發現這個系列命令講的最好的一篇文章,英文好的同學可以直接去看原文。 Multithreaded simple data type access and atomic variables

sync_fetch_and_add系列一共有十二個函數,有加/減/與/或/異或/等函數的原子性操作函數,syncd然後自加,傳回的是自加以前的值。以count = 4為例,呼叫sync_fetch_and_add(&count,1),之後,回傳值為4,然後,count變成了5.
有sync_fetch_and_add,自然也就有sync_add_and_fetch,有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_swool (type的比較與交換,如果*ptr == oldval,就將newval寫入*ptr,
第一個函數在相等並寫入的情況下返回true.
第二個函數在返回操作之前的值。
sync_synchronize (...)

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

value, ...)

將*ptr設為value並傳回*ptr操作之前的值。
void sync_lock_release (type *ptr, ...)
將*ptr置0

以上是linux無鎖定的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn