《LINUX系統編程》筆記p11

公共資源

也稱為共享資源,是指可以被多個并發進程或線程共同訪問(讀取或寫入)的系統資源。

臨界資源

是公共資源的一個子集。特指那些一次僅允許一個進程或線程訪問的公共資源。如果一個進程正在使用它,其他試圖訪問該資源的進程必須等待,直到當前訪問完成。

臨界區

指進程中訪問臨界資源的那段代碼。它不是資源本身,而是操作資源的代碼段。 目標:確保當一個進程在臨界區內執行時,其他任何進程都不能進入其自身的臨界區(訪問同一個臨界資源)。

互斥

是一種機制、原則或屬性,用于保證對臨界資源的互斥訪問。它要求在任何時刻,最多只能有一個執行流(進程或線程)進入與某一臨界資源相關的臨界區。

互斥量

作用:用于線程的互斥,以避免對臨界資源訪問時沖突問題。

用法:通常在進入臨界區之前加鎖,退出臨界區時解鎖。

類型:pthread_mutex_t定義變量:pthread_mutex_t mutex;
操作:初始化(兩種方法)1. pthread_mutex_init(&mutex, NULL);//此方法需要銷毀2. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//此方法不需要銷毀加鎖: pthread_mutex_lock(&mutex);已經被加鎖,線程阻塞。pthread_mutex_trylock(&mutex);已經被加鎖,線程不阻塞,通過返回值判斷所得狀態。解鎖:pthread_mutex_unlock(&mutex);銷毀: pthread_mutex_destroy(&mutex);

死鎖

什么是死鎖:

多進程或多線程,在競爭資源的時候,由于互相搶占而導致僵死的狀態叫做死鎖。

死鎖是由于一方拿到資源不釋放。而其他線程或進程無法獲取資源導致。

解決死鎖的方法:

  1. 使用非阻塞方式拿鎖,不等待。

    • 拿到做做事,拿不到鎖做其他的事。
  2. 獲取多個互斥量時規定拿鎖的順序。

    • 如有A、B兩個鎖,規定先拿A再拿B,拿不到A就不允許拿B。
  3. 互斥量允許強制剝奪。

    • 如果有線程占用互斥量時間過長,允許其他線程強制剝奪互斥量。

示例代碼

#include?<unistd.h>
#include?<sys/stat.h>
#include?<fcntl.h>#include?<pthread.h>#define?MAX_THREADS (5)??// 最大的線程個數static?int?is_running =?1;
// 針對 is_running 這個資源的鎖
static?pthread_mutex_t?running_lock;// 臨界資源i
static?long?int?i =?0;
// 針對 i 這個資源的鎖,并初始化
static?pthread_mutex_t?count_lock = PTHREAD_MUTEX_INITIALIZER;
// 定義一個線程處理函數
void?*?mythread(void* data)?{long?int?arg = (long?int)data;char?charactor =?'a'?+ arg;while(1) {int?run;pthread_mutex_lock(&running_lock);run = is_running;pthread_mutex_unlock(&running_lock);if?(!run)break;// 對i 這個臨界資源加鎖pthread_mutex_lock(&count_lock);if?(i == arg) {printf("%c", charactor);fflush(stdout);i = (i +?1) % MAX_THREADS;}// 解鎖pthread_mutex_unlock(&count_lock);}return?data;
}int?main(int?argc,?char?* argv[])?{pthread_t?thread[MAX_THREADS];int?ret;printf("請輸入回車開始和結束線程\n");getchar();// 初始化運行狀態鎖pthread_mutex_init(&running_lock,?NULL);for?(long?int?i =?0; i < MAX_THREADS; i++) {void?*varg = (void*)i;ret = pthread_create(&thread[i],?NULL, mythread, varg);if?(ret) {printf("pthread_create error: %d\n", ret);return?1;}}// 等待回車getchar();pthread_mutex_lock(&running_lock);is_running =?0;pthread_mutex_unlock(&running_lock);// 殺死所有的線程// for (int i = 0; i < MAX_THREADS; i++) {//     pthread_cancel(thread[i]);// }?// 等待回收資源for?(int?i =?0; i < MAX_THREADS; i++) {void?* pret;pthread_join(thread[i], &pret);printf("pret:%p\n", pret);}?// 銷毀運行狀態鎖pthread_mutex_destroy(&running_lock);printf("主進程結束\n");return?0;
}

條件變量:

條件變量是一種線程同步機制,他允許一個線程在某個條件不滿足時主動進入等待狀態并釋放鎖,直到另一個線程改變這個條件后再通知其他線程繼續運行。

核心思想:以查。


定義條件變量:pthread_cond_t mycond;
操作:初始化(兩種方法)1. pthread_cond_init(&mycond, NULL);//此方法需要銷毀2. pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;//此方法不需要銷毀等待條件: pthread_cond_wait(&mycond, &mutex);喚醒等待的線程:pthread_cond_signal(&mycond); // 喚醒一個線程pthread_cond_broadcast(&mycond);  // 廣播喚醒全部線程。銷毀: pthread_cond_destroy(&mycond);

示例代碼:

#include?<stdio.h>
#include?<string.h>
#include?<sys/types.h>
#include?<unistd.h>
#include?<sys/stat.h>
#include?<fcntl.h>#include?<pthread.h>#define?MAX_THREADS (5)??// 最大的線程個數static?int?is_running =?1;
// 針對 is_running 這個資源的鎖
static?pthread_mutex_t?running_lock;// 臨界資源i
static?long?int?i =?0;
// 針對 i 這個資源的鎖,并初始化
static?pthread_mutex_t?count_lock = PTHREAD_MUTEX_INITIALIZER;
// 定義 i 這個資源的條件變量,并初始化
static?pthread_cond_t?count_cond = PTHREAD_COND_INITIALIZER;// 定義一個線程處理函數
void?*?mythread(void* data)?{long?int?arg = (long?int)data;char?charactor =?'a'?+ arg;while(1) {int?run;// pthread_mutex_lock(&running_lock);run = is_running;// pthread_mutex_unlock(&running_lock);if?(!run)break;// 對i 這個臨界資源加鎖pthread_mutex_lock(&count_lock);while( i != arg && is_running !=?0) {pthread_cond_wait(&count_cond, &count_lock);}if?(i == arg) {printf("%c", charactor);fflush(stdout);i = (i +?1) % MAX_THREADS;// 喚醒條件變量關聯的其他線程。// pthread_cond_signal(&count_cond); //喚醒一個線程pthread_cond_broadcast(&count_cond);?//喚醒全部}/* else {// 現在不應當我來打印。解鎖睡覺等待條件變化pthread_cond_wait(&count_cond, &count_lock);// 如果返回,說明條件變化,立即加鎖做事情}*/// 解鎖pthread_mutex_unlock(&count_lock);}return?data;
}int?main(int?argc,?char?* argv[])?{pthread_t?thread[MAX_THREADS];int?ret;printf("請輸入回車開始和結束線程\n");getchar();// 初始化運行狀態鎖pthread_mutex_init(&running_lock,?NULL);for?(long?int?i =?0; i < MAX_THREADS; i++) {void?*varg = (void*)i;ret = pthread_create(&thread[i],?NULL, mythread, varg);if?(ret) {printf("pthread_create error: %d\n", ret);return?1;}}// 等待回車getchar();pthread_mutex_lock(&running_lock);is_running =?0;pthread_mutex_unlock(&running_lock);// 再次喚醒所有的進程退出。pthread_cond_broadcast(&count_cond);?//喚醒全部// 殺死所有的線程// for (int i = 0; i < MAX_THREADS; i++) {//     pthread_cancel(thread[i]);// }?// 等待回收資源for?(int?i =?0; i < MAX_THREADS; i++) {void?* pret;pthread_join(thread[i], &pret);printf("pret:%p\n", pret);}?// 銷毀運行狀態鎖pthread_mutex_destroy(&running_lock);printf("主進程結束\n");return?0;
}

網絡IPC

IP 地址(Internet Protocal Address):

IP 地址是記錄一個網絡設備的邏輯地址。

IP地址的分類:

  • IPv4: 用 32bit 來標識網絡設備(四個字節)

    • 192.168.1.100
  • IPv6:用 128bit 來標識網絡設備

    • 不穩定,是未來的發展趨勢。

端口號(port):

用來記錄網路設備上特定進程的關聯號碼。是一個16位的無符號性整數。

值 1~65535

IP 地址和子網掩碼

A類:255.0.0.0

B類:255.255.0.0

C類:255.255.255.0

查看IP地址的命令:

#?Windows?
ipconfig
#?早期 Linux/UNIX
ifconfig
#?Ubuntu Linux?
ip a
ip addr
ip address

內容如下:

inet 192.168.33.151/24 brd 192.168.33.255 scope global dynamic noprefixroute ens33# IP 地址: 192.168.33.151
# 廣播地址:192.168.33.255
# 子網掩碼: /24 表示 (255.255.255.0)IP 地址 & 子網掩碼 = 192.168.33.151 & 255.255.255.0 = 192.168.33.0 本網路的地址

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

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

相關文章

spring-kafka消費異常處理

默認的消費異常處理 默認情況下&#xff0c;如果程序沒有顯式做任何的異常處理&#xff0c;spring-kafka會提供一個默認的DefaultErrorHandler, 它會使用FixedBackOff做重試&#xff0c;會不間斷的連續重試最多9次&#xff0c;也就是說一個消息最多會被消費10次。如果重試次數耗…

leecode73 矩陣置零

我的思路 這個題目不難&#xff0c;就是一句話&#xff0c;遍歷這個矩陣的時候&#xff0c;當遇到0的時候就把該行該列改為0&#xff0c;同時為了不影響后續的遍歷&#xff0c;我們可以將這個遍歷和修改分為兩個數組。使用mn的輔助空間 class Solution {public void setZeroe…

Spring Boot 與前端文件上傳跨域問題:Multipart、CORS 與網關配置

前言在前后端分離架構下&#xff0c;文件上傳是一個常見功能。但在 Spring Boot 項目中&#xff0c;我們經常會遇到前端調用接口上傳文件時出現 跨域問題&#xff0c;表現為&#xff1a;瀏覽器控制臺報錯&#xff1a;Access-Control-Allow-Origin 缺失或不匹配。使用 FormData …

快速解決云服務器的數據庫PhpMyAdmin登錄問題

打開PhpMyAdmin數據庫管理器登錄頁面賬號密碼就是你的用戶名&#xff08;如YiXun&#xff09;和密碼注意&#xff1a;root賬戶的密碼&#xff0c;點擊下面的“root密碼”即能看到或修改PhpMyAdmin無法打開如果打不開&#xff1a;在數據庫&#xff0c;點擊PHPMyAdmin&#xff0c…

vite+vue3中使用FFmpeg@0.12.15實現視頻編輯功能,不依賴SharedArrayBuffer!!!

FFmpeg0.12.15完全不依賴SharedArrayBuffer!!!強烈推薦使用 本文章主要是在vitevue3項目中使用FFmpeg&#xff0c;只展示了如何在項目中引入和基礎的使用 更多詳細參數可參照 ffmpeg官網https://ffmpeg.org/ 一、安裝FFmpeg 可通過npm直接安裝 npm install ffmpeg/core0.12.10…

構網型5MW中壓儲能變流升壓一體機技術方案

1 構網型儲能背景概述1.1 新型電力系統亟需構網支撐眾所周知&#xff0c;新型電力系統具有兩高特征&#xff1a;高比例新能源大規模并網、高比例電力電子大范圍接入。近年來風光裝機占比越來越高&#xff0c;而傳統火電裝機占比越來越低&#xff0c;并在2023年首次降至50%以下…

SRE 系列(七)| 從技術架構到團隊組織

目錄SRE落地與組織架構實踐技術架構與組織架構的匹配技術架構示例運維職責分工技術保障體系SRE 多角色團隊總結SRE落地與組織架構實踐 在落地 SRE 時&#xff0c;很多團隊最關心的問題之一就是組織架構&#xff1a;我們究竟需要怎樣的團隊形態&#xff0c;才能支撐微服務和分…

香港期權市場的主要參與者有哪些?

本文主要介紹香港期權市場的主要參與者有哪些&#xff1f;香港期權市場作為全球重要的金融衍生品市場&#xff0c;其參與者結構呈現多元化、專業化的特征&#xff0c;主要涵蓋以下核心群體。香港期權市場的主要參與者有哪些&#xff1f;1. 機構投資者&#xff08;主導力量&…

搜維爾科技:全身可穿戴Teslasuit動捕服的功能,自立式FES裝置

功能性電刺激 (FES) 設備廣泛應用于康復和醫療實踐。其底層技術利用低能量電脈沖&#xff0c;在中風、脊髓損傷、多發性硬化癥、腦癱等各種疾病患者中人工產生身體運動。一般來說&#xff0c;FES系統可以分為三類&#xff1a;開環、有限狀態控制和閉環方法。這三種方法描述了 F…

【深度學習新浪潮】MoE是什么技術?

混合專家模型(Mixture of Experts,MoE)是大模型時代提升計算效率與模型能力的核心技術之一。其核心思想是將復雜任務分解為多個子任務,通過動態路由機制激活特定專家網絡處理輸入數據,從而在保持模型容量的同時大幅降低計算成本。以下是技術細節與實際應用的深度解析: 一…

Java進階教程,全面剖析Java多線程編程,實現Callable接口實現多線程,筆記05

Java進階教程&#xff0c;全面剖析Java多線程編程&#xff0c;實現Callable接口實現多線程&#xff0c;筆記05 參考資料 多線程&JUC-05-多線程的第三種實現方式一、實現Callable接口實現多線程 二、三種方式對比 優點缺點繼承Thread類編程比較簡單&#xff0c;可以直接使…

軌道交通絕緣監測—軌道交通安全的隱形防線

軌道交通絕緣監測作為保障行車安全的核心環節&#xff0c;正面臨多重技術與環境挑戰。復雜運營環境是首要痛點&#xff0c;隧道內高濕度&#xff08;月均濕度達95%&#xff09;會增大鋼軌表面電導率&#xff0c;霧氣中的鹽分更會加速扣件絕緣性能下降&#xff0c;導致過渡電阻驟…

tar-符號連接(軟連接)

1.符號連接是什么符號鏈接&#xff08;symbolic link&#xff0c;也叫軟鏈接&#xff09;本質上是一個 指向路徑的特殊文件。例如&#xff1a;ln -s /etc/passwd passwd_link這會創建一個叫 passwd_link 的文件&#xff0c;但它本身不存放 /etc/passwd 的內容&#xff0c;而是存…

ffmpeg切割音頻

ffmpeg切割音頻 我希望對指定音頻切割&#xff0c;按照開始時間&#xff0c;結束時間&#xff0c;切割成新文件&#xff0c;自動保存&#xff0c;非常好用 step1: from pydub import AudioSegment import os# 配置FFmpeg路徑&#xff08;確保路徑正確&#xff09; ffmpeg_path …

Python 批量處理:Markdown 與 HTML 格式相互轉換

文章目錄引言與同類工具的優勢對比Python 將 Markdown 轉換為 HTMLPython 將 HTML 轉換為 Markdown批量轉換與自動化處理引言 在多平臺內容分發與管理的場景中&#xff0c;文檔格式轉換已成為內容生態系統中的關鍵環節。Markdown 作為輕量級標記語言&#xff0c;以其語法簡潔、…

御控物聯網遠程控制水泵啟停智能自控解決方案

在農業灌溉、城市排水、工業供水等場景中&#xff0c;水泵作為核心設備&#xff0c;長期面臨以下難題&#xff1a;人工依賴度高&#xff1a;需24小時值守&#xff0c;暴雨或干旱時響應滯后&#xff1b; 能耗浪費嚴重&#xff1a;空轉、過載運行導致電費居高不下&#xff1b; …

RedisI/O多路復用:單線程網絡模型epoll工作流程

epoll1. 在內核創建eventpoll結構體&#xff0c;返回句柄epfd&#xff08;唯一標識&#xff09;eventpoll包含存放被監聽的fd的紅黑樹&#xff0c;和存放已就緒的fd的鏈表2. 將要監聽的fd加入到epoll紅黑樹中&#xff0c;并設置callback回調函數callback觸發時&#xff0c;就將…

SmartBear API Hub助力MCP開發,無縫、安全的連接AI與外部工具

人工智能&#xff08;AI&#xff09;技術的應用場景日益廣泛&#xff0c;如何讓不同的AI系統之間實現高效、無縫的交互&#xff0c;成為了業界的重要課題。隨著人工智能技術的不斷進步&#xff0c;模型上下文協議&#xff08;MCP&#xff09;應運而生。MCP為不同AI系統之間提供…

如何選擇高性價比的iOS簽名服務?關鍵因素與價格區間

作為一名摸爬滾打多年的開發者&#xff0c;我來和你聊聊怎么挑一個靠譜又不坑的iOS簽名服務。這玩意兒選不好&#xff0c;輕則測試團隊干瞪眼&#xff0c;重則App下架&#xff0c;用戶投訴&#xff0c;簡直是我們開發者的噩夢。別光看價格&#xff01;先想清楚你的核心需求在選…

MoonBit 正式加入 WebAssembly Component Model 官方文檔 !

我們非常高興地宣布&#xff0c;MoonBit 已正式收錄在 WebAssembly Component Model 的官方文檔中。這不僅是對 MoonBit 技術路線的一次肯定&#xff0c;也讓我們有機會和 Rust、Go、C# 等語言一起&#xff0c;出現在開發者查閱組件模型的入口頁面中。一、 關于 WebAssembly Co…