Linux系統(tǒng)編程-(pthread)線程通信(自旋鎖)

      網(wǎng)友投稿 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 #include #include #include #include #include #include #include #include pthread_spinlock_t spinlock; int data; /* 線程工作函數(shù) */ void *thread_work_func(void *dev) { while(1) { pthread_spin_lock(&spinlock); //上鎖 printf("data=%d\n",data); pthread_spin_unlock(&spinlock); //解鎖 sleep(1); } } /* 線程工作函數(shù) */ void *thread_work_func2(void *dev) { while(1) { pthread_spin_lock(&spinlock); //上鎖 data++; pthread_spin_unlock(&spinlock); //解鎖 sleep(1); } } int main(int argc,char **argv) { //初始化自旋鎖 pthread_spin_init(&spinlock,PTHREAD_PROCESS_PRIVATE); /*1. 創(chuàng)建子線程1*/ pthread_t thread_id; if(pthread_create(&thread_id,NULL,thread_work_func,NULL)!=0) { printf("子線程1創(chuàng)建失敗.\n"); return -1; } /*2. 創(chuàng)建子線程2*/ pthread_t thread_id2; if(pthread_create(&thread_id2,NULL,thread_work_func2,NULL)!=0) { printf("子線程2創(chuàng)建失敗.\n"); return -1; } /*3. 等待線程的介紹*/ pthread_join(thread_id,NULL); pthread_join(thread_id2,NULL); //銷毀自旋鎖 pthread_spin_destroy(&spinlock); return 0; }

      Linux系統(tǒng)編程-(pthread)線程通信(自旋鎖)

      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)容。

      上一篇:做完表格能自動(dòng)累計(jì)數(shù)量嗎
      下一篇:演示中的AI墨仔(智能排版)如何開啟?有什么用?
      相關(guān)文章
      亚洲国产精品人人做人人爽| 久久夜色精品国产噜噜亚洲a| 久久精品国产亚洲av麻豆蜜芽| 亚洲妇熟XXXX妇色黄| 亚洲AV蜜桃永久无码精品| 亚洲AV香蕉一区区二区三区| 亚洲www77777| 亚洲精品无码你懂的| 亚洲国产精品无码久久九九大片| 国产 亚洲 中文在线 字幕| 天天爽亚洲中文字幕| 亚洲砖码砖专无区2023| 中文字幕 亚洲 有码 在线| 亚洲av一本岛在线播放| 亚洲福利电影一区二区?| 在线观看亚洲人成网站| 亚洲最大的黄色网| 亚洲午夜国产精品| 亚洲一区二区影院| 亚洲白色白色永久观看| 亚洲激情视频图片| 亚洲国产成人久久精品大牛影视| 在线观看亚洲电影| 亚洲人成片在线观看| 亚洲美女aⅴ久久久91| 亚洲乱码在线视频| 亚洲精品无码专区在线| 亚洲精品女同中文字幕| 国产偷国产偷亚洲高清在线| 国产偷国产偷亚洲清高APP| 亚洲精品欧美综合四区| 亚洲男人在线无码视频| 日本亚洲视频在线| 亚洲高清日韩精品第一区| youjizz亚洲| 婷婷亚洲综合一区二区| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 欧洲亚洲综合一区二区三区| 亚洲VA综合VA国产产VA中| 伊人久久综在合线亚洲91| 亚洲人成在线观看|