基本概念:
何謂自旋鎖?它是為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有乙個保持者,也就說,在任何時刻最多只能有乙個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋鎖不會引起呼叫者睡眠,如果自旋鎖已經被別的執行單元保持,呼叫者就一直迴圈在那裡看是否該自旋鎖的保持者已經釋放了鎖,"自旋"一詞就是因此而得名。
一、初始化和銷毀鎖
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時間 這種資源消耗可以分為兩類 建立鎖所需要的資源 當執行緒被阻塞時...