欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

    shiro會話管理示例代碼

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

    Linux與Windows文件互傳(VMWare)

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

    詳解linux grep命令

    本篇文章主要介紹了linux grep命令,現(xiàn)在分享給大家,也給大家做個參考。正在學(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賬號可以免密登陸15服務(wù)器的test賬號,需要的朋友可以參考下
    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ī)硪黄狪O復(fù)用之select poll epoll的總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • PHP腳本內(nèi)存泄露導(dǎo)致Apache頻繁宕機(jī)解決方法

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

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

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

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

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

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

最新評論