最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux實(shí)現(xiàn)線程同步的多種方式匯總

 更新時(shí)間:2025年06月09日 11:34:03   作者:kaede  
本文詳細(xì)介紹了Linux下線程同步的多種方法,包括互斥鎖、自旋鎖、信號(hào)量以及它們的使用示例,通過這些同步機(jī)制,可以解決線程安全問題,防止資源競(jìng)爭(zhēng)導(dǎo)致的錯(cuò)誤,示例代碼展示了如何在多線程環(huá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)文章

  • Linux?VIM編輯二進(jìn)制文件方式

    Linux?VIM編輯二進(jìn)制文件方式

    這篇文章主要介紹了Linux?VIM編輯二進(jìn)制文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 基于windowx的Hyper-v安裝CentOS系統(tǒng)

    基于windowx的Hyper-v安裝CentOS系統(tǒng)

    這篇文章主要介紹了基于windowx的Hyper-v安裝CentOS系統(tǒng) ,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Linux中避免客戶端與服務(wù)端的端口沖突

    Linux中避免客戶端與服務(wù)端的端口沖突

    在Linux系統(tǒng)中,為了防止客戶端程序在分配TCP源端口時(shí)使用到服務(wù)器程序綁定的特定端口(例如12345),可以采用多種策略來避免端口沖突,總體而言,優(yōu)先使用sysctl設(shè)置保留端口是最簡(jiǎn)單有效的解決方案,但也可以采用其他方法來確保端口不會(huì)發(fā)生沖突
    2024-10-10
  • linux服務(wù)器上openssl版本升級(jí)方式

    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í)行文件

    一文詳解Linux如何查詢服務(wù)和定位可執(zhí)行文件

    這篇文章主要為大家詳細(xì)介紹了Linux中查詢服務(wù)和定位可執(zhí)行文件的相關(guān)命令,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-11-11
  • 利用lynis如何進(jìn)行l(wèi)inux漏洞掃描詳解

    利用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
  • Linux掛載本地操作系統(tǒng)ISO鏡像的操作步驟

    Linux掛載本地操作系統(tǒng)ISO鏡像的操作步驟

    這篇文章主要介紹了在服務(wù)器上掛載ISO文件的兩種方法:使用loop設(shè)備和直接掛載光驅(qū)設(shè)備,選擇哪種方法取決于你手里的是ISO文件路徑還是光驅(qū)設(shè)備節(jié)點(diǎn),通過簡(jiǎn)單的判斷命令可以快速選擇合適的掛載方式,需要的朋友可以參考下
    2026-03-03
  • Linux系統(tǒng)之iostat命令的基本使用詳解

    Linux系統(tǒng)之iostat命令的基本使用詳解

    iostat命令是Linux/Unix系統(tǒng)中用于監(jiān)控磁盤I/O活動(dòng)的工具,可以顯示磁盤的讀寫速率、I/O等待時(shí)間、CPU使用率等信息,通過分析這些指標(biāo),可以幫助系統(tǒng)管理員發(fā)現(xiàn)性能瓶頸,并進(jìn)行優(yōu)化
    2025-12-12
  • 如何利用Gitlab-ci持續(xù)部署到遠(yuǎn)程機(jī)器(詳細(xì)教程)

    如何利用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ì)配置

    這篇文章主要介紹了Centos7 Mysql 5.6 多主一從 解決方案與詳細(xì)配置,需要的朋友可以參考下
    2016-04-04

最新評(píng)論

安塞县| 桂林市| 灵山县| 烟台市| 南康市| 江北区| 香格里拉县| 拜泉县| 福泉市| 闵行区| 沈阳市| 巴楚县| 临潭县| 离岛区| 五原县| 闻喜县| 乌兰察布市| 东城区| 奇台县| 唐山市| 昌图县| 大悟县| 吴桥县| 揭阳市| 英超| 晋州市| 南城县| 南华县| 隆德县| 法库县| 包头市| 黔西县| 德安县| 丹寨县| 明溪县| 崇礼县| 静安区| 临江市| 海安县| 澄迈县| 镇宁|