Linux實現(xiàn)線程同步的多種方式匯總
更新時間:2025年06月09日 11:34:03 作者:kaede
本文詳細介紹了Linux下線程同步的多種方法,包括互斥鎖、自旋鎖、信號量以及它們的使用示例,通過這些同步機制,可以解決線程安全問題,防止資源競爭導致的錯誤,示例代碼展示了如何在多線程環(huán)境中正確地管理共享資源,確保線程安全,需要的朋友可以參考下
什么是線程同步?
想象一下超市收銀臺:如果所有顧客(線程)同時擠向同一個收銀臺(共享資源),場面會一片混亂。線程同步就是給顧客們發(fā)"排隊號碼牌",確保:
- 有序訪問:每次只處理一個顧客
- 協(xié)調(diào)工作:收銀員(CPU)高效服務
- 避免沖突:防止算錯賬(數(shù)據(jù)錯誤)
Linux提供5種"排隊機制"解決多線程協(xié)作問題:
一、互斥鎖(單人洗手間規(guī)則)
#include <pthread.h>
// 創(chuàng)建鎖(相當于洗手間的"有人/無人"標識)
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
void* thread_task(void* arg) {
// 嘗試進入(如果里面有人就排隊等待)
pthread_mutex_lock(&lock);
/* 臨界區(qū)開始(你的"私人時間") */
printf("Thread %d using resource\n", *(int*)arg);
sleep(1); // 模擬耗時操作
/* 臨界區(qū)結(jié)束 */
// 開門出來(讓下一位使用)
pthread_mutex_unlock(&lock);
return NULL;
}
適用場景:
- 文件寫入操作
- 銀行賬戶余額修改
- 任何需要"獨享"資源的場景
特點:
- 簡單易用
- 過度使用會降低并發(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)者-消費者模型(如消息隊列)
- 線程間任務協(xié)調(diào)
三、自旋鎖(搶車位)
pthread_spinlock_t parking_lock;
// 初始化鎖(停車場入口)
pthread_spin_init(&parking_lock, PTHREAD_PROCESS_PRIVATE);
void* driver(void* arg) {
// 開車繞圈找空位(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ā)
- 實時系統(tǒng)
注意事項:
- 會浪費CPU資源
- 比互斥鎖響應更快
鎖類型對比表:
| 場景 | 推薦鎖類型 | 類比 |
|---|---|---|
| 短時間獨占操作 | 自旋鎖 | 快速便利店購物 |
| 長時間獨占操作 | 互斥鎖 | 餐廳包間用餐 |
| 多讀少寫 | 讀寫鎖 | 圖書館 |
| 線程組協(xié)調(diào) | 屏障 | 旅行團集合 |
| 事件通知 | 條件變量 | 咖啡廳叫號系統(tǒng) |
到此這篇關于Linux實現(xiàn)線程同步的五種方式的文章就介紹到這了,更多相關Linux線程同步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于windowx的Hyper-v安裝CentOS系統(tǒng)
這篇文章主要介紹了基于windowx的Hyper-v安裝CentOS系統(tǒng) ,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
如何利用Gitlab-ci持續(xù)部署到遠程機器(詳細教程)
這篇文章主要介紹了如何利用Gitlab-ci持續(xù)部署到遠程機器(詳細教程),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
Centos7 Mysql 5.6 多主一從 解決方案與詳細配置
這篇文章主要介紹了Centos7 Mysql 5.6 多主一從 解決方案與詳細配置,需要的朋友可以參考下2016-04-04

