Linux實(shí)現(xiàn)線程同步的多種方式匯總
什么是線程同步?
想象一下超市收銀臺(tái):如果所有顧客(線程)同時(shí)擠向同一個(gè)收銀臺(tái)(共享資源),場(chǎng)面會(huì)一片混亂。線程同步就是給顧客們發(fā)"排隊(duì)號(hào)碼牌",確保:
- 有序訪問:每次只處理一個(gè)顧客
- 協(xié)調(diào)工作:收銀員(CPU)高效服務(wù)
- 避免沖突:防止算錯(cuò)賬(數(shù)據(jù)錯(cuò)誤)
Linux提供5種"排隊(duì)機(jī)制"解決多線程協(xié)作問題:
一、互斥鎖(單人洗手間規(guī)則)
#include <pthread.h>
// 創(chuàng)建鎖(相當(dāng)于洗手間的"有人/無人"標(biāo)識(shí))
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void* thread_task(void* arg) {
// 嘗試進(jìn)入(如果里面有人就排隊(duì)等待)
pthread_mutex_lock(&lock);
/* 臨界區(qū)開始(你的"私人時(shí)間") */
printf("Thread %d using resource\n", *(int*)arg);
sleep(1); // 模擬耗時(shí)操作
/* 臨界區(qū)結(jié)束 */
// 開門出來(讓下一位使用)
pthread_mutex_unlock(&lock);
return NULL;
}
適用場(chǎng)景:
- 文件寫入操作
- 銀行賬戶余額修改
- 任何需要"獨(dú)享"資源的場(chǎng)景
特點(diǎn):
- 簡(jiǎn)單易用
- 過度使用會(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)
三、自旋鎖(搶車位)
pthread_spinlock_t parking_lock;
// 初始化鎖(停車場(chǎng)入口)
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;
}
適用場(chǎng)景:
- 極短操作(<0.1毫秒)
- 內(nèi)核開發(fā)
- 實(shí)時(shí)系統(tǒng)
注意事項(xiàng):
- 會(huì)浪費(fèi)CPU資源
- 比互斥鎖響應(yīng)更快
鎖類型對(duì)比表:
| 場(chǎng)景 | 推薦鎖類型 | 類比 |
|---|---|---|
| 短時(shí)間獨(dú)占操作 | 自旋鎖 | 快速便利店購(gòu)物 |
| 長(zhǎng)時(shí)間獨(dú)占操作 | 互斥鎖 | 餐廳包間用餐 |
| 多讀少寫 | 讀寫鎖 | 圖書館 |
| 線程組協(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)文章
基于windowx的Hyper-v安裝CentOS系統(tǒng)
這篇文章主要介紹了基于windowx的Hyper-v安裝CentOS系統(tǒng) ,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
linux服務(wù)器上openssl版本升級(jí)方式
文章詳細(xì)介紹了在Linux服務(wù)器上升級(jí)OpenSSL版本的步驟,包括查看當(dāng)前版本、檢查yum源、下載源碼、編譯安裝、創(chuàng)建軟鏈、更新動(dòng)態(tài)鏈接庫以及驗(yàn)證版本2025-03-03
一文詳解Linux如何查詢服務(wù)和定位可執(zhí)行文件
這篇文章主要為大家詳細(xì)介紹了Linux中查詢服務(wù)和定位可執(zhí)行文件的相關(guān)命令,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-11-11
利用lynis如何進(jìn)行l(wèi)inux漏洞掃描詳解
這篇文章主要給大家介紹了關(guān)于利用lynis如何進(jìn)行l(wèi)inux漏洞掃描的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
如何利用Gitlab-ci持續(xù)部署到遠(yuǎn)程機(jī)器(詳細(xì)教程)
這篇文章主要介紹了如何利用Gitlab-ci持續(xù)部署到遠(yuǎn)程機(jī)器(詳細(xì)教程),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Centos7 Mysql 5.6 多主一從 解決方案與詳細(xì)配置
這篇文章主要介紹了Centos7 Mysql 5.6 多主一從 解決方案與詳細(xì)配置,需要的朋友可以參考下2016-04-04

