Linux系統編程 | 互斥鎖

1、什么是互斥鎖

????????如果信號量的值最多為 1,那實際上相當于一個共享資源在任意時刻最多只能有一個線程在訪問,這樣的邏輯被稱為“互斥”。這時,有一種更加方便和語義更加準確的工具來滿足這種邏輯,他就是互斥鎖

????????“鎖”是一種非常形象的說法:就像一個房間只能住一個人一樣,任何人進去之后就把門鎖上了,其他任何人都不能進去,直到進去的那個人重新開開鎖,即釋放了這個鎖資源為止。

????????互斥鎖用于保護線程中某一個共享資源, 該資源在任意一個時刻只允許有一個線程可以訪問的情況。互斥鎖是專門用于處理線程互斥的一種方式,它有兩種狀態:上鎖狀態、解鎖狀態。

????????例如有多個線程有可能會對某一個鏈表進行刪除、插入的操作。那么任何一個線程想要操作該鏈表前都應該使用互斥鎖來阻塞等待操作的權限(pthread_mutex_lock),當獲得權限后上鎖,阻止其他線程來同時訪問該鏈表造成鏈表的錯亂。當操作結束后使用解鎖函數(pthread_mutex_unlock)把鎖資源釋放出來。

????????特點: 如果互斥鎖處于上鎖狀態,那么再上鎖就會造成阻塞,直到這把鎖解開了之后,才能上鎖。解鎖狀態依然繼續解鎖,不會阻塞。

2、線程互斥鎖API接口

(1)、定義互斥鎖變量

????????數據類型: pthread_mutex_t

pthread_mutex_t m;

(2)、初始化互斥鎖

#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);參數:mutex: 未初始化過互斥鎖變量的地址mutexattr:普通屬性,NULL
返回值:成功:0失敗:非0錯誤碼

????????靜態初始化:

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
也就是說,以上這句話等價于:
pthread_mutex_t m;
pthread_mutex_init(&m,NULL);

(3)、線程上鎖

#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
參數:mutex:互斥鎖變量的地址
返回值:成功:0失敗:非0錯誤碼

(4)、線程解鎖

#include <pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
參數:mutex:互斥鎖變量的地址
返回值:成功:0失敗:非0錯誤碼

(5)、銷毀互斥鎖

#include <pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
參數:mutex:互斥鎖變量的地址
返回值:成功:0失敗:非0錯誤碼

3、互斥鎖應用實例

????????互斥鎖使用場景:當我們使用一些臨界資源時,防止多個線程同時訪問,我們可以這么做,在訪問臨界資源前,讓線程先上鎖,然后再訪問資源,訪問完了之后就解鎖,讓別的線程去上鎖。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>int g_val = 0;
//1)定義互斥鎖變量。 -----》數據類型  pthread_mutex_t 
pthread_mutex_t mutex;//線程的例程函數,也就是創建線程之后,去執行這個函數
void* routine1(void *arg)
{pthread_mutex_lock(&mutex);//上鎖//寫操作,修改內存空間的值 g_val = 100;int i;for(i=0; i<5; i++){sleep(1);    g_val += g_val*i;printf("%d  routine1 100  g_val:%d\n",i,g_val);        }pthread_mutex_unlock(&mutex);//解鎖
}//線程的例程函數,也就是創建線程之后,去執行這個函數
void* routine2(void *arg)
{pthread_mutex_lock(&mutex);//上鎖//寫操作,修改內存空間的值 g_val = 200;int i;for(i=0; i<5; i++){sleep(1);    g_val += g_val*i;    printf("routine2 200  g_val:%d\n",g_val);        }pthread_mutex_unlock(&mutex);//解鎖
}//線程的例程函數,也就是創建線程之后,去執行這個函數
void* routine3(void *arg)
{pthread_mutex_lock(&mutex);//上鎖int i;//讀操作,此時僅僅只是將這個值打印出來for(i=0; i<5; i++){sleep(1);        printf("routine3  g_val:%d\n",g_val);        }pthread_mutex_unlock(&mutex);//解鎖
}//線程的例程函數,也就是創建線程之后,去執行這個函數
void* routine4(void *arg)
{pthread_mutex_lock(&mutex);//上鎖int i;//讀操作,此時僅僅只是將這個值打印出來for(i=0; i<5; i++){sleep(1);        printf("routine4  g_val:%d\n",g_val);        }pthread_mutex_unlock(&mutex);//解鎖
}int main(int argc, char **argv)
{//2)初始化 互斥鎖pthread_mutex_init(&mutex,NULL);// 創建一個新的線程1pthread_t thread1;    pthread_create(&thread1,NULL,routine1,NULL);                      // 創建一個新的線程2pthread_t thread2;    pthread_create(&thread2,NULL,routine2,NULL);    // 創建一個新的線程3pthread_t thread3;    pthread_create(&thread3,NULL,routine3,NULL);                      // 創建一個新的線程4pthread_t thread4;    pthread_create(&thread4,NULL,routine4,NULL);    //接合子線程 --阻塞等待子線程退出 回收資源pthread_join(thread1,NULL);pthread_join(thread2,NULL);pthread_join(thread3,NULL);pthread_join(thread4,NULL);//5)銷毀互斥鎖pthread_mutex_destroy(&mutex);return 0;
}

????????如下圖所示為互斥鎖程序的演示結果。從終端打印輸出的信息,可以看到每個線程都是依次有序的排隊進行獲取釋放互斥鎖進行運行的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86734.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86734.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86734.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據文件寫入技術詳解:從CSV到Excel的ETL流程優化

文章大綱&#xff1a; 引言&#xff1a;數據文件寫入在ETL流程中的重要性 在現代數據處理中&#xff0c;ETL&#xff08;提取、轉換、加載&#xff09;流程是數據分析和業務決策的核心環節&#xff0c;而數據文件寫入作為ETL的最后一步&#xff0c;扮演著至關重要的角色。它不…

在Cline中使用Gemini CLI,圖形化界面操作:從命令行到可視化操作的全新體驗,爽炸天!

在軟件開發的進程中&#xff0c;命令行工具雖功能強大&#xff0c;但對部分開發者而言&#xff0c;圖形化界面的直觀與便捷性有著獨特魅力。此前&#xff0c;Cline 新版本集成 Gemini CLI 的消息在開發者社群引發熱議&#xff0c;尤其對于偏好圖形界面的開發者來說&#xff0c;…

正交視圖三維重建 筆記 2d線到3d線

這種代碼怎么寫好&#xff0c;x1tx1 x2tx2 x1x2在一條線上tx2和tx1在一條線上輸出x1 y1 ty1&#xff0c;x2 y2 ty2 線過的點 的集合 俯視圖找深度 測試一下 目標 四條線變一條線 復雜度賊大跑起來賊慢 加了16000條 去重 for (const [x1, y1, x2, y2, lineId, type] of front…

【耳機】IEM 前腔 后腔 泄壓孔 -> 調音紙對頻響曲線的影響

一、后腔 1.曲線說明 綠色&#xff1a;無調音紙 紅色&#xff1a;使用Y3 粉色&#xff1a;使用Y6 2.結論 后腔是負責微調的&#xff0c;阻尼大小和低頻升降成 反比。 阻 大 -> 低頻 降低 阻 小 -> 低頻 升高 二、前腔 1.曲線說明 紅色&#xff1a;無調音紙 黃色&am…

信息安全與網絡安全---引言

僅供參考 文章目錄 一、計算機安全1.1 CIA三元組1.2 影響等級1.3 計算機安全的挑戰 二、OSI安全體系結構2.1 安全攻擊2.2 安全服務2.3 安全機制 三、基本安全設計準則四、攻擊面和攻擊樹&#xff08;重點&#xff09;4.1 攻擊面4.2 攻擊樹 五、習題與答案 一、計算機安全 &…

C# VB.NET取字符串中全角字符數量和半角字符數量

C# VB.NET中Tuple輕量級數據結構和固定長度數組-CSDN博客 https://blog.csdn.net/xiaoyao961/article/details/148872196 下面提供了三種統計字符串中全角和半角字符數量的方法&#xff0c;并進行了性能對比。 性能對比&#xff08;處理 100 萬次 "Hello&#xff0c;世界…

CC++公司面試題[個人總結,持續更新中]

嵌入式初級面試題 姓名: 日期: 開始時間: (答題時間60分鐘,答題過程中請不要上網查詢資料,不可帶走答卷) 1:設float a=2,b=4,c=3;,以下C語言表達式與代數式(a+b)+c計算結果不一致的是( )[3分] A.(a+b)c/2 B. (1/2)*(a+b)c C. (a+b)c*1/2 D.c/2(a+b) 2:為了向二進制文件尾部…

Qt QGraphics簡述及例程 - QGraphicsView、QGraphicsScene和QGraphicsItem

Qt QGraphics簡述及例程 引言一、簡單例程二、關于坐標系問題 引言 QGraphics*是Qt框架中&#xff0c;主要用于處理2D圖形項的顯示、交互和管理的模塊&#xff0c;包括QGraphicsView、QGraphicsScene和QGraphicsItem。提供了一套高效的場景-視圖架構&#xff0c;適合開發復雜的…

代碼隨想錄打卡第一天

文章講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;手把手帶你撕出正確的二分法 | 二分查找法 | 二分搜索法 | LeetCode&#xff1a;704. 二分查找_嗶哩嗶哩_bilibili class Solution { public:int search(vector<int>& nums, int target) {int left0;//左邊界int…

時序數據庫全面解析與對比

文章目錄 1. 時序數據庫概述1.1 時序數據特點1.2 時序數據庫核心功能 2. 主流時序數據庫對比2.1 InfluxDB2.2 Prometheus2.3 TimescaleDB2.4 OpenTSDB2.5 TDengine 3. 全方位對比3.1 功能對比3.2 性能對比3.3 適用場景對比3.4 社區與生態 4. 選型建議4.1 根據數據規模選擇4.2 根…

【STM32CubeMX】ST官網MCU固件庫下載及安裝

用STM32CubeMX自帶的Updater更新固件包會遇到各種幺蛾子&#xff08;如下圖所示&#xff09;&#xff0c;所以干脆自己下載固件包&#xff0c;快速升級固件。 1. ST官網搜索你需要的MCU型號&#xff0c;并選擇需要的固件版本&#xff0c;我這里是H7的MCU所以就找H7&#xff08;…

青少年編程與數學 01-012 通用應用軟件簡介 13 網上學習資源

青少年編程與數學 01-012 通用應用軟件簡介 13 網上學習資源 一、什么是網上學習資源&#xff08;一&#xff09;網上學習資源的基本定義&#xff08;二&#xff09;網上學習資源的工作原理&#xff08;三&#xff09;網上學習資源的類型 二、網上學習資源的重要意義&#xff0…

Python Selenium 忽略證書錯誤

文章目錄 Python Selenium 忽略證書錯誤和忽略&#x1f527; **一、忽略 SSL 證書錯誤**1. **基礎配置&#xff08;適用于 Chrome/Firefox&#xff09;**2. **高級場景&#xff1a;指定證書指紋**3. **瀏覽器兼容方案** &#x1f507; **二、隱藏 DevTools 監聽提示**1. **禁用…

YOLOv8模型在RDK5開發板上的部署指南:.pt到.bin轉換與優化實踐

以下是針對在RDK5開發板(基于NVIDIA Jetson Orin平臺)部署YOLOv8模型的詳細技術指南,涵蓋從模型轉換、優化到部署的全流程: YOLOv8模型在RDK5開發板上的部署指南:.pt到.bin轉換與優化實踐 ——基于TensorRT的高性能嵌入式部署方案 第一章:技術背景與核心概念 1.1 RDK5開…

內網橫向-工作流

一、信息收集階段 操作 工具 / 命令 說明 系統基礎信息采集 systeminfo、whoami /user 查看系統版本、用戶 SID 等 域內用戶 / 組查詢 net user /domain、net group "domain admins" /domain 列出域用戶及管理員組 域控及網絡結構探測 nltest /dsgetdc、ip…

個人日記本小程序開發方案(使用IntelliJ IDEA)

個人日記本小程序開發方案(使用IntelliJ IDEA) 一、項目創建與環境配置 1. 新建項目 打開IDEA → New Project → JavaFX選擇JDK 11+版本添加必要依賴:<!-- pom.xml --> <dependencies><dependency><groupId

react快速開始項目模板

代碼倉庫 gitee 創建項目 首先保證安裝了node, 然后使用vite創建項目 vite npm create vite react-learn cd react-learn npm i 目錄結構 一個完整的前端項目需要: 狀態管理 在全局維護共有的狀態(數據), 讓頁面組件之間共享數據, 我們使用pinia路由 路由讓頁面之間可以…

scrapy+django+pyecharts+mysql 實現西安游客行為分析系統大屏_用戶畫像_空間分析_路線智能推薦

項目地址 link 此處展示部分結果 思路 描述性統計 可視化大屏 用戶畫像&#xff08;聚類&#xff0c;情感分析&#xff09; 空間分析

AC-DC-AC間接變頻電源設計方案(工頻50Hz→20KHz)

AC-DC-AC間接變頻電源設計方案(工頻50Hz→20KHz) 一、方案分析與選擇 1. 可選電路結構分析 方案1:二極管整流+Boost PFC+全橋逆變 優點: 輸入功率因數高(>0.99)直流電壓穩定可控輸出波形質量好缺點: 電路復雜度較高成本相對較高方案2:晶閘管相控整流+電容濾波+半…

七天學完十大機器學習經典算法-09.梯度提升算法:預測藝術的精進之道

接上一篇《七天學完十大機器學習經典算法-08.K均值聚類&#xff1a;無監督學習的萬能分箱術》 想象你在教一個學生解決復雜數學題&#xff1a;先讓他做基礎題&#xff0c;然后針對錯誤部分強化練習&#xff0c;再針對新錯誤繼續訓練...如此反復精進&#xff0c;直到完美掌握——…