linux支持的哪些操作是具有原子特性的?知道這些東西是理解和設計無鎖化linux算法的基礎。
下面的東西整理自網絡。先感謝大家的分享!
sync_fetch_and_add系列的命令,發現這個系列命令講的最好的一篇文章,英文好的同學可以直接去看原文。Multithreaded simple data type access and atomic variables
sync_fetch_and_add系列一共有十二個linux,有加/減/與/或/異或/等函數的原子性操作函數,sync_fetch_and_add,顧名思義,先fetch,然后自加,返回的是自加以前的值。以linux = 4為例,調用sync_fetch_and_add(&count,1),之后,返回值是4,然后,count變成了5.
有sync_fetch_and_add,自然也就有sync_add_and_fetch,呵呵這個的意思就很清楚了,先自加,在返回。他們哥倆的關系與i++和++i的關系是一樣的。被譚浩強他老人家收過保護費的都會清楚了。
有了這個寶貝函數,我們就有新的解決辦法了。對于多線程對全局linux進行自加,我們就再也不用理線程鎖了。下面這行代碼,和上面被pthread_mutex保護的那行代碼作用是一樣的,而且也是線程linux的。
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 (…)
理解上面這個東西,參照: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