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