linux多執行緒之自旋鎖

2021-07-16 15:25:12 字數 2711 閱讀 5250

基本概念:

何謂自旋鎖?它是為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個保持者,也就說,在任何時刻最多只能有乙個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,"自旋"一詞就是因此而得名。

一、初始化和銷毀鎖

pthread_spin_destroy(p)    posix programmer's manual   pthread_spin_destroy(p)

name

pthread_spin_destroy, pthread_spin_init - destroy or initialize a spin

lock object (advanced realtime threads)

synopsis

#include int pthread_spin_destroy(pthread_spinlock_t *lock);

int pthread_spin_init(pthread_spinlock_t *lock, int pshared);

兩個函式的返回值:若成功,返回0;否則,返回錯誤編號關於pthread_spin_init函式的引數pshard,單程序可以設定成pthread_process_shared

二、加鎖與解鎖

pthread_spin_lock(p)       posix programmer's manual      pthread_spin_lock(p)

name

pthread_spin_lock, pthread_spin_trylock - lock a spin lock object

(advanced realtime threads)

synopsis

#include int pthread_spin_lock(pthread_spinlock_t *lock);

int pthread_spin_trylock(pthread_spinlock_t *lock);

int pthread_spin_unlock(pthread_spinlock_t *lock);

兩個函式的返回值:若成功,返回0;否則,返回錯誤編號例子1,互斥鎖的耗時, gcc pthread_mutex.c -pthread -o mutex:

#include #include #include #include #include #include static int num = 0;

static int count = 10000000;

static pthread_mutex_t mutex = pthread_mutex_initializer;

void perror(const char *s)

long long getsystemtime()

void* fun2(void *arg)

}int main()

int i = 1;

for (; i<=count; ++i)

pthread_join(thread2, null);

long long end = getsystemtime();

printf("the num is %d, pay %lld ms\n", num, (end-start));

return 0;

}

例子2,自旋鎖的耗時,gcc pthread_spin.c -pthread -o spin:

#include #include #include #include #include #include static int num = 0;

static int count = 10000000;

static pthread_spinlock_t spin;

void perror(const char *s)

long long getsystemtime()

void* fun2(void *arg)

}int main()

int i = 1;

for (; i<=count; ++i)

pthread_join(thread2, null);

long long end = getsystemtime();

printf("the num is %d, pay %lld ms\n", num, (end-start));

pthread_spin_destroy(&spin);

return 0;

}

執行結果,可以看到某些條件下,自旋鎖是比較快的:

參考:《unix環境高階程式設計》·第三版

end;

執行緒同步 多執行緒自旋鎖

短時間鎖定的情況下,自旋鎖 spinlock 更快。因為自旋鎖本質上不會讓執行緒休眠,而是一直迴圈嘗試對資源訪問,直到可用。所以自旋鎖線程被阻塞時,不進行執行緒上下文切換,而是空轉等待。對於多核cpu而言,減少了切換執行緒上下文的開銷,從而提高了效能。class program spinlock是n...

C 多執行緒之旅實戰 自旋鎖那點事

ticket lock clh lock mcs lock 總結前一篇文章講的是帶鎖的併發資料結構,而且講到了如果不帶鎖將會面臨什麼樣的問題。這一部分我將為大家帶來乙個全新的資料結構 自旋鎖。這是一種不使用阻塞庫的資料結構,我們將不使用阻塞庫的結構稱為非阻塞,但是不是所有的非阻塞資料結構都是無鎖的。...

posix多執行緒有感 自旋鎖

自旋鎖是smp架構中的一種low level的同步機制。當執行緒a想要獲取一把自旋鎖而該鎖又被其它執行緒鎖持有時,執行緒a會在乙個迴圈中自旋以檢測鎖是不是已經可用了。對於自選鎖需要注意 使用任何鎖需要消耗系統資源 記憶體資源和cpu時間 這種資源消耗可以分為兩類 建立鎖所需要的資源 當執行緒被阻塞時...