亞寵展、全球?qū)櫸锂a(chǎn)業(yè)風(fēng)向標(biāo)——亞洲寵物展覽會(huì)深度解析
1077
2025-04-05
1. 自旋鎖介紹
自旋鎖不管是內(nèi)核編程,還是應(yīng)用層編程都會(huì)用到;自旋鎖和互斥量類似,它不是通過(guò)休眠使進(jìn)程阻塞,而是在獲取鎖之前一直處于忙等(也就叫自旋)狀態(tài)。
自旋鎖可用于下面的情況:鎖被持有的時(shí)間短,并且線程不希望再重新調(diào)度上花費(fèi)太多的成本。自旋鎖通常作為底層原語(yǔ)用于實(shí)現(xiàn)其他類型的鎖。根據(jù)他們所基于的系統(tǒng)架構(gòu),可以通過(guò)使用測(cè)試并設(shè)置指令有效地實(shí)現(xiàn)。當(dāng)然這里說(shuō)的有效也還是會(huì)導(dǎo)致CPU資源的浪費(fèi):當(dāng)線程自旋鎖變?yōu)榭捎脮r(shí),CPU不能做其他任何事情,這也是自旋鎖只能夠被只有一小段時(shí)間的原因。
自旋鎖總結(jié):
自旋鎖和互斥鎖的使用框架、場(chǎng)景相似的。
互斥鎖在得不到鎖的時(shí)候會(huì)休眠。
自旋鎖在得不到鎖的時(shí)候不會(huì)休眠,會(huì)一直檢測(cè)鎖的狀態(tài)。
自旋鎖比較適合保護(hù)變量賦值、函數(shù)調(diào)用等場(chǎng)景。
2. 自旋鎖相關(guān)接口函數(shù)
1. 銷毀自旋鎖 int pthread_spin_destroy(pthread_spinlock_t *); 2. 初始化自旋鎖 int pthread_spin_init(pthread_spinlock_t *, int); 3. 自旋鎖上鎖(阻塞) int pthread_spin_lock(pthread_spinlock_t *); 4. 自旋鎖上鎖(非阻塞) int pthread_spin_trylock(pthread_spinlock_t *); 5. 自旋鎖解鎖 int pthread_spin_unlock(pthread_spinlock_t *); 以上函數(shù)成功都返回0.
pthread_spin_init 函數(shù)的pshared參數(shù)表示進(jìn)程共享屬性,表明自旋鎖是如何獲取的,如果它設(shè)為PTHREAD_PROCESS_SHARED,則自旋鎖能被,可以訪問(wèn)鎖底層內(nèi)存的線程所獲取,即使那些線程屬于不同的進(jìn)程。否則pshared參數(shù)設(shè)為PTHREAD_PROCESS_PRIVATE,自旋鎖就只能被初始化該鎖的進(jìn)程內(nèi)部的線程訪問(wèn)到。
如果自旋鎖當(dāng)前在解鎖狀態(tài),pthread_spin_lock函數(shù)不要自旋就可以對(duì)它加鎖,試圖對(duì)沒有加鎖的自旋鎖進(jìn)行解鎖,結(jié)果是未定義的。需要注意,不要在持有自旋鎖情況下可能會(huì)進(jìn)入休眠狀態(tài)的函數(shù),如果調(diào)用了這些函數(shù),會(huì)浪費(fèi)CPU資源,其他線程需要獲取自旋鎖需要等待的時(shí)間更長(zhǎng)了。
3. 自旋鎖運(yùn)用模板
下面代碼創(chuàng)建了兩個(gè)線程,分別訪問(wèn)一個(gè)全局變量,這里采用自旋鎖進(jìn)行保護(hù)。
#include
linux 任務(wù)調(diào)度
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。