亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

  • CentOS中環(huán)境變量與配置文件的深入講解

    CentOS中環(huán)境變量與配置文件的深入講解

    這篇文章主要給大家介紹了關(guān)于CentOS中環(huán)境變量與配置文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用CentOS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • shiro會(huì)話管理示例代碼

    shiro會(huì)話管理示例代碼

    Shiro提供了完整的企業(yè)級(jí)會(huì)話管理功能,不依賴(lài)于底層容器(如web容器tomcat),直接使用Shiro的會(huì)話管理可以直接替換如Web容器的會(huì)話管理
    2017-09-09
  • Linux與Windows文件互傳(VMWare)

    Linux與Windows文件互傳(VMWare)

    這篇文章主要介紹了Linux與Windows文件互傳的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 詳解linux grep命令

    詳解linux grep命令

    本篇文章主要介紹了linux grep命令,現(xiàn)在分享給大家,也給大家做個(gè)參考。正在學(xué)習(xí)的同學(xué)可以了解一下。
    2016-11-11
  • Linux實(shí)現(xiàn)免密登錄的配置方法

    Linux實(shí)現(xiàn)免密登錄的配置方法

    這篇文章主要介紹了Linux實(shí)現(xiàn)免密登錄的配置方法,實(shí)現(xiàn)的效果是,當(dāng)前服務(wù)器的test賬號(hào)可以免密登陸15服務(wù)器的test賬號(hào),需要的朋友可以參考下
    2024-04-04
  • linux文件及用戶管理的實(shí)例練習(xí)

    linux文件及用戶管理的實(shí)例練習(xí)

    在本篇文章里小編給大家分享了關(guān)于linux文件及用戶管理的實(shí)例練習(xí),需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • IO復(fù)用之select poll epoll的總結(jié)(推薦)

    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-01
  • PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機(jī)解決方法

    PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機(jī)解決方法

    這篇文章主要介紹了PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機(jī)解決方法,本文的原因是因?yàn)镸axRequestsPerChild參數(shù)沒(méi)有配置正確,配置MaxRequestsPerChild后解決了本文中的問(wèn)題,需要的朋友可以參考下
    2014-09-09
  • Ubuntu18 給terminal改個(gè)漂亮的命令行提示符的方法

    Ubuntu18 給terminal改個(gè)漂亮的命令行提示符的方法

    這篇文章主要介紹了Ubuntu18 給terminal改個(gè)漂亮的命令行提示符的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • ubuntu 16.04系統(tǒng)完美解決pip不能升級(jí)的問(wèn)題

    ubuntu 16.04系統(tǒng)完美解決pip不能升級(jí)的問(wèn)題

    這篇文章主要介紹了ubuntu 16.04系統(tǒng)完美解決pip不能升級(jí)的問(wèn)題 ,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-04-04

最新評(píng)論