Linux使用者層多執行緒無鎖化原子操作

2021-07-09 06:30:43 字數 2119 閱讀 7210

最近由於專案需要,需要將原先使用的icu4c由4.x版本公升級到5.x,但是利用編譯好的5.x版本的icu4c鏈結庫編譯原先的程式時,報出了類似undefined __sync_sub_and_fetch的錯誤,沒辦法,最後通過檢視icu4c的原始碼,加入了一些編譯選項,將相關的__sync_***x函式預設不使用。

雖然問題解決了,但是第一次接觸到__sync_***型別的函式,還是想弄明白它的作用。後來發現這一類函式非常有用,尤其是在做多執行緒的無鎖化操作時,它感覺就相當與核心裡面使用的atomic_t。

__sync_fetch_and_add系列一共有十二個函式,有加/減/與/或/異或/等函式的原子性操作函式, __sync_fetch_and_add, 顧名思義,現fetch,然後自加,返回的是自加以前的值。以count = 4為例,呼叫__sync_fetch_and_add(&count,1),之後,返回值是4,然後,count變成了5.

在用gcc編譯的時候要加上選項 -march=i686(後來發現並不是所有的環境下編譯都需要加這個,比如,在我的ubuntu 12.04 intel處理器的環境下,不許要加這個引數)

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);

自己也寫了乙個小的測試程式,驗證使用這一類函式和普通執行緒鎖的效率對比

#include #include #include #include #include int global_int = 0;

pthread_mutex_t mutex = pthread_mutex_initializer;

void* thread_func(void *arg)

}int main()

for (i = 0; i < proc; i++)

gettimeofday(&end_time, null);

printf("thread number = %d global_int = %d cost time msecond = %ld\n", proc, global_int, (long)((end_time.tv_sec - start_time.tv_sec)*1000 + (end_time.tv_usec - start_time.tv_usec)/1000));

}

使用這一類函式,不許要包含特殊的標頭檔案,編譯如下:

gcc -dwith_atomic -o test test.c -pthread
執行結果:

thread number = 4 global_int = 4000000 cost time msecond = 133
而如果使用普通的執行緒鎖,執行結果如下:

thread number = 4 global_int = 4000000 cost time msecond = 526

Linux多執行緒互斥鎖

多執行緒程式設計中,多執行緒程式設計 可以用互斥鎖 也稱互斥量 可以用來保護關鍵 段,以確保其獨佔式的訪問,這有點像二進位制訊號量。posix互斥鎖相關函式主要有以下5個 cpp view plain copy include intpthread mutex init pthread mutex ...

linux多執行緒(互斥鎖)

當多個執行緒想要對同乙個資源進行操作的時候,為了使得不出現髒讀的情況,要用互斥鎖來規定執行緒的先後順序。互斥鎖和訊號量的作用類似。鎖的資料型別 pthread mutex t mutes 鎖的初始化 int pthread mutex init pthread mutex t const pthre...

多執行緒無鎖演算法之無鎖佇列的實現

今天花了近兩個小時的時間好好的理解了一下多執行緒無鎖佇列的實現,檢視了很多資料和文獻。在我看來,實現無鎖佇列的關鍵點有二 1 各個平台的原子操作或者說cas原語 2 aba問題的理解和解決。首先來說說這個cas原語,所謂cas compare and swap 即比較並交換,在 intel 處理器中...