Linux實(shí)現(xiàn)線程同步的多種方式匯總
什么是線程同步?
想象一下超市收銀臺(tái):如果所有顧客(線程)同時(shí)擠向同一個(gè)收銀臺(tái)(共享資源),場(chǎng)面會(huì)一片混亂。線程同步就是給顧客們發(fā)"排隊(duì)號(hào)碼牌",確保:
- 有序訪問(wèn):每次只處理一個(gè)顧客
- 協(xié)調(diào)工作:收銀員(CPU)高效服務(wù)
- 避免沖突:防止算錯(cuò)賬(數(shù)據(jù)錯(cuò)誤)
Linux提供5種"排隊(duì)機(jī)制"解決多線程協(xié)作問(wèn)題:
一、互斥鎖(單人洗手間規(guī)則)
#include <pthread.h> // 創(chuàng)建鎖(相當(dāng)于洗手間的"有人/無(wú)人"標(biāo)識(shí)) pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; void* thread_task(void* arg) { // 嘗試進(jìn)入(如果里面有人就排隊(duì)等待) pthread_mutex_lock(&lock); /* 臨界區(qū)開(kāi)始(你的"私人時(shí)間") */ printf("Thread %d using resource\n", *(int*)arg); sleep(1); // 模擬耗時(shí)操作 /* 臨界區(qū)結(jié)束 */ // 開(kāi)門(mén)出來(lái)(讓下一位使用) pthread_mutex_unlock(&lock); return NULL; }
適用場(chǎng)景:
- 文件寫(xiě)入操作
- 銀行賬戶余額修改
- 任何需要"獨(dú)享"資源的場(chǎng)景
特點(diǎn):
- 簡(jiǎn)單易用
- 過(guò)度使用會(huì)降低并發(fā)性能
二、條件變量(咖啡廳取餐系統(tǒng))
pthread_cond_t order_ready = PTHREAD_COND_INITIALIZER; pthread_mutex_t counter_lock = PTHREAD_MUTEX_INITIALIZER; int order_number = 0; // 顧客線程(等待取餐) void* customer(void* arg) { pthread_mutex_lock(&counter_lock); while(order_number == 0) { // 必須用while循環(huán)檢查 pthread_cond_wait(&order_ready, &counter_lock); // 放下鎖等待通知 } printf("Got order %d!\n", order_number); pthread_mutex_unlock(&counter_lock); return NULL; } // 廚師線程(通知取餐) void* chef(void* arg) { sleep(2); // 模擬做飯時(shí)間 pthread_mutex_lock(&counter_lock); order_number = 123; pthread_cond_signal(&order_ready); // 叫號(hào)通知顧客 pthread_mutex_unlock(&counter_lock); return NULL; }
工作流程:
- 顧客:鎖定柜臺(tái) → 檢查訂單 → 等待叫號(hào)
- 廚師:完成訂單 → 鎖定柜臺(tái) → 更新訂單 → 發(fā)送通知
- 顧客:被喚醒 → 重新檢查 → 取餐
適用場(chǎng)景:
- 生產(chǎn)者-消費(fèi)者模型(如消息隊(duì)列)
- 線程間任務(wù)協(xié)調(diào)
三、自旋鎖(搶車(chē)位)
pthread_spinlock_t parking_lock; // 初始化鎖(停車(chē)場(chǎng)入口) pthread_spin_init(&parking_lock, PTHREAD_PROCESS_PRIVATE); void* driver(void* arg) { // 開(kāi)車(chē)?yán)@圈找空位(CPU忙等待) pthread_spin_lock(&parking_lock); /* 停車(chē)成功(臨界區(qū)) */ printf("Car %d parked\n", *(int*)arg); // 開(kāi)走釋放車(chē)位 pthread_spin_unlock(&parking_lock); return NULL; }
適用場(chǎng)景:
- 極短操作(<0.1毫秒)
- 內(nèi)核開(kāi)發(fā)
- 實(shí)時(shí)系統(tǒng)
注意事項(xiàng):
- 會(huì)浪費(fèi)CPU資源
- 比互斥鎖響應(yīng)更快
鎖類(lèi)型對(duì)比表:
場(chǎng)景 | 推薦鎖類(lèi)型 | 類(lèi)比 |
---|---|---|
短時(shí)間獨(dú)占操作 | 自旋鎖 | 快速便利店購(gòu)物 |
長(zhǎng)時(shí)間獨(dú)占操作 | 互斥鎖 | 餐廳包間用餐 |
多讀少寫(xiě) | 讀寫(xiě)鎖 | 圖書(shū)館 |
線程組協(xié)調(diào) | 屏障 | 旅行團(tuán)集合 |
事件通知 | 條件變量 | 咖啡廳叫號(hào)系統(tǒng) |
到此這篇關(guān)于Linux實(shí)現(xiàn)線程同步的五種方式的文章就介紹到這了,更多相關(guān)Linux線程同步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IO復(fù)用之select poll epoll的總結(jié)(推薦)
下面小編就為大家?guī)?lái)一篇IO復(fù)用之select poll epoll的總結(jié)(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機(jī)解決方法
這篇文章主要介紹了PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機(jī)解決方法,本文的原因是因?yàn)镸axRequestsPerChild參數(shù)沒(méi)有配置正確,配置MaxRequestsPerChild后解決了本文中的問(wèn)題,需要的朋友可以參考下2014-09-09Ubuntu18 給terminal改個(gè)漂亮的命令行提示符的方法
這篇文章主要介紹了Ubuntu18 給terminal改個(gè)漂亮的命令行提示符的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06ubuntu 16.04系統(tǒng)完美解決pip不能升級(jí)的問(wèn)題
這篇文章主要介紹了ubuntu 16.04系統(tǒng)完美解決pip不能升級(jí)的問(wèn)題 ,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下2018-04-04