學習筆記(linux高級編程)9

void pthread_cleanup_push(void (*routine)(void *), void *arg);

??? 功能:注冊一個線程清理函數

??? 參數,routine,線程清理函數的入口

???????? arg,清理函數的參數。

??? 返回值,無

void pthread_cleanup_pop(int execute);

??? 功能:調用清理函數

??? execute,非0? 執行清理函數

???????????? 0 ,不執行清理

????????????

??? 返回值,無

這兩個成對使用


線程控制:互斥與同步

??? 概念:

??? 互斥 ===》在多線程中對臨界資源的排他性訪問。

??? 互斥機制 ===》互斥鎖? ===》保證臨界資源的訪問控制。

pthread_mutex_t?? mutex;

??? 互斥鎖類型??????? 互斥鎖變量 內核對象

??? 框架:

??? ?定義互斥鎖 ==》初始化鎖 ==》加鎖 ==》解鎖 ==》銷毀

???????? ****????????????????????? ***????? ***

??? ?1、定義:

???????? pthread_mutex_t?? mutex;

??? ?2、初始化鎖

???????? int pthread_mutex_init(

???????????? pthread_mutex_t *mutex,

???????????? const pthread_mutexattr_t *attr);

???????? 功能:將已經定義好的互斥鎖初始化。

???????? 參數:mutex 要初始化的互斥鎖

???????????? ? atrr? 初始化的值,一般是NULL表示默認鎖

???????? 返回值:成功 0

????????????????? 失敗 非零

3、加鎖:

???????? int pthread_mutex_lock(pthread_mutex_t *mutex);

???????? 功能:用指定的互斥鎖開始加鎖代碼

???????????? ? 加鎖后的代碼到解鎖部分的代碼屬于原子操作,

???????????? ? 在加鎖期間其他進程/線程都不能操作該部分代碼

???????????? ? 如果該函數在執行的時候,mutex已經被其他部分

???????????? ? 使用則代碼阻塞。

???????? 參數: mutex 用來給代碼加鎖的互斥鎖

???????? 返回值:成功 0

????????????????? 失敗 非零

??? ?4、解鎖

???????? int pthread_mutex_unlock(pthread_mutex_t *mutex);

???????? 功能:將指定的互斥鎖解鎖。

???????????? ? 解鎖之后代碼不再排他訪問,一般加鎖解鎖同時出現。

???????? 參數:用來解鎖的互斥鎖

???????? 返回值:成功 0

????????????????? 失敗 非零

5、銷毀

???????? ?int pthread_mutex_destroy(pthread_mutex_t *mutex);

???????? ?功能:使用互斥鎖完畢后需要銷毀互斥鎖

???????? ?參數:mutex 要銷毀的互斥鎖

???????? ?返回值:成功? 0

????????????????? ?失敗? 非零

6、trylock

???????? int pthread_mutex_trylock(pthread_mutex_t *mutex);

???????? 功能:類似加鎖函數效果,唯一區別就是不阻塞。

???????? 參數:mutex 用來加鎖的互斥鎖

???????? 返回值:成功 0

????????????????? 失敗 非零

????????????????? E_AGAIN

線程的同步 ===》同步 ===》有一定先后順序的對資源的排他性訪問。

??? 原因:互斥鎖可以控制排他訪問但沒有次序。

??? linux下的線程同步? ===》信號量機制 ===》semaphore.h?? posix

??? sem_open();

??? 信號量的分類:

??? 1、無名信號量 ==》線程間通信

??? 2、有名信號量 ==》進程間通信

框架:

??? 信號量的定義 ===》信號量的初始化 ==》信號量的PV操作===》信號量的銷毀。

阻塞

???????????? ? 1 表示綠燈,進程可以通過執行

???????? 返回值:成功? 0

????????????????? 失敗? -1;

??? 3、信號量的PV 操作

??? ?? P ===》申請資源===》申請一個二值信號量

??? ?? V ===》釋放資源===》釋放一個二值信號量

??? ?? P操作對應函數 ==》sem_wait();

??? ?? V操作對應函數 ==》sem_post();

??? int sem_wait(sem_t *sem);

??? 功能:判斷當前sem信號量是否有資源可用。

???????? ? 如果sem有資源(==1),則申請該資源,程序繼續運行

???????? ? 如果sem沒有資源(==0),則線程阻塞等待,一旦有資源

???????? ? 則自動申請資源并繼續運行程序。

???????? ? 注意:sem 申請資源后會自動執行 sem = sem - 1;

??? 參數:sem 要判斷的信號量資源

??? 返回值:成功 0

???????????? 失敗 -1

??? int sem_post(sem_t *sem);

??? 功能:函數可以將指定的sem信號量資源釋放

???????? ? 并默認執行,sem = sem+1;

???????? ? 線程在該函數上不會阻塞。

??? 參數:sem 要釋放資源的信號量

??? 返回值:成功 0

???????????? 失敗 -1;

??? 4、信號量的銷毀

??? ?? int sem_destroy(sem_t *sem);

??? ?? 功能:使用完畢將指定的信號量銷毀

??? ?? 參數:sem要銷毀的信號量

??? ?? 返回值:成功 0

????????????????? 失敗? -1;

互斥鎖和信號量區別:

用的地方:??? 唯一性互斥訪問,??? 不同線程順序

個數:??????? 1個鎖,? ???????????多個鎖

上鎖解鎖對象:同一個線程,??????? 處理順序用不同鎖

產生死鎖的主要原因:

(1) 因為系統資源不足。

(2) 進程運行推進的順序不合適。

(3) 資源分配不當等。

如果系統資源充足,進程的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則

就會因爭奪有限的資源而陷入死鎖。其次,進程運行推進順序與速度不同,也可能產生死鎖。

產生死鎖的四個必要條件:

(1) 互斥條件:一個資源每次只能被一個進程使用。

(2) 請求與保持條件:一個進程因請求資源而阻塞,得到的對已獲得的資源保持不放。

(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。(高優先級運行,低優先級拿到鎖沒釋放不運行)

(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。

Linux 里Sudo reboot重啟 在配置bash后

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

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

相關文章

Perl語言入門指南

一、緒論 1.1 Perl語言概述 1.2 Perl的特色 1.3 Perl面臨的問題 1.4 Perl語言的應用領域 二、Perl語言基礎 2.1 Perl語言的歷史發展 2.2 Perl語言的基本語法 2.3 Perl語言的數據類型 三、Perl語言控制結構 3.1 條件語句 3.2 循環結構 3.3 函數和子程序 四、Perl語…

OpenStack開源虛擬化平臺(一)

目錄 一、OpenStack背景介紹(一)OpenStack是什么(二)OpenStack的主要服務 二、計算服務Nova(一)Nova組件介紹(二)Libvirt簡介(三)Nova中的RabbitMQ解析 OpenS…

MySQL-數據操作類型的角度理解 S鎖 X鎖

文章目錄 1、S鎖和S鎖互相兼容2、S鎖和X鎖互斥3、X鎖和X鎖也互斥4、X鎖和S鎖也互斥5、select * from account for update;6、select * from account for update nowait;7、select * from account for update skip locked; 1、S鎖和S鎖互相兼容 2、S鎖和X鎖互斥 3、X鎖和X鎖也互…

20240702 每日AI必讀資訊

🔍GPTPdf:使用類似GPT-4o的多模態LLM分析PDF文件 - 使用類似 GPT-4o 多模態模型解析 PDF 文件,轉換為 Markdown 格式。 - 代碼簡潔高效,僅293行。 - 解析結果幾乎完美包括排版、數學公式、表格、圖片、圖表等內容。 &#x1…

【記錄】IDEA2023的激活與安裝

前言: 記錄IDEA2023的激活與安裝 第一步:官網下載安裝包: 下載地址:https://www.jetbrains.com/idea/download/other.html 這個最好選擇2023版本,用著很nice。 安裝步驟就不詳解了,無腦下一步就可以了…

(四十七)Vue Router之路由守衛

文章目錄 概念全局路由守衛全局前置守衛全局解析守衛全局后置路由守衛 獨享路由守衛組件內的守衛beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave 完整的導航解析流程 上一篇:(四十六)Vue Router組件所獨有的兩個鉤子activate、deactivat…

VLAN原理與配置

AUTHOR :閆小雨 DATE:2024-04-28 目錄 VLAN的三種端口類型 VLAN原理 什么是VLAN 為什么使用VLAN VLAN的基本原理 VLAN標簽 VLAN標簽各字段含義如下: VLAN的劃分方式 VLAN的劃分包括如下5種方法: VLAN的接口鏈路類型 創建V…

Android system.img掛載和解除掛載

Android system.img掛載和解除掛載 解包后的super.img,里面最重要的是system.img文件,如何對system.img進行掛載和解除掛載是需要掌握的能力 基礎知識 system.img、vendor.img 都存在兩種格式raw,sparse ,在ubuntu命令窗口下執行下執行&am…

深度學習之生成對抗網絡 BigGAN

BigGAN(Big Generative Adversarial Networks)是生成對抗網絡(GAN)的一種變體,專注于生成高質量、大尺寸的圖像。BigGAN 是由 DeepMind 的研究人員于 2018 年提出的。其核心思想是通過增加模型的規模(更深的網絡和更多的參數)來提高生成圖像的質量,同時引入一些新的技術…

便簽 Pro(Mac 智能便簽工具)專業版怎么樣,值得購買嗎?

使用 Mac 的小伙伴平時都是怎么記錄工作生活中的碎片信息?用聊天軟件,還是系統備忘錄呢? 實際體驗下來,其實都難以稱得上好用。 趕緊來了解一下 Mac 多彩思維速記工具便簽 Pro!擁有智能邊框大小、iCloud 同步、歷史記…

矩陣置零解題

給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 示例 1: 輸入:matrix [[1,1,1],[1,0,1],[1,1,1]] 輸出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 輸入&…

VUE3解決跨域問題

本文基于vue3 vite element-plus pnpm 報錯:**** has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 原因:前端不能直接訪問其他IP,需要用vite.config.ts &#xff0…

onvif 基本概念

media_server、device_server和event_server是三個重要的服務。 1. media_server 功能:media_server服務主要負責處理媒體流相關的請求,包括視頻和音頻流的傳輸、控制等。實現:該服務通常使用RTSP(Real Time Streaming Protocol…

API-本地存儲

學習目標: 掌握本地存儲 學習內容: 本地存儲介紹本地存儲分類存儲復雜數據類型 本地存儲介紹: 以前我們頁面寫的數據一刷新頁面就沒有了,是不是? 隨著互聯網的快速發展,基于網頁的應用越來越普遍,同時也…

算法基礎入門 - 2.棧、隊列、鏈表

文章目錄 算法基礎入門第二章 棧、隊列、鏈表2.1 隊列2.2 棧2.3 紙牌游戲2.4 鏈表如何建立鏈表?1.我們需要一個頭指針(head)指向鏈表的初始。鏈表還沒建立時頭指針head為空2.建立第一個結點3.設置剛創建的這個結點的數據域(左半)和指針域(右半)4.設置頭指針,頭指針可方便…

【鴻蒙學習筆記】運算符

官方文檔&#xff1a;ArkTS語言介紹 目錄標題 賦值運算符比較運算符一元運算符&#xff1a;自增自減運算符二元運算符位運算符邏輯運算符 賦值運算符 運算符解釋解釋賦值運算符x x y加-x x - y減*x x * y乘/x x / y除%x x % y取余<<x x << y按位左移>&…

問題-小技巧-專業版Win11怎么啟動電腦的休眠模式?

專業版Win11怎么啟動電腦的休眠模式&#xff1f; powercfg -a powercfg -hibernate on 啟用管理員面板依次輸入上述命令就可以了。

寵物醫院管理系統-計算機畢業設計源碼07221

目 錄 1 緒論 1.1 選題背景和意義 1.2國內外研究現狀 1.3論文結構與章節安排 2 寵物醫院管理系統系統分析 2.1 可行性分析 2.1.1技術可行性分析 2.1.2 操作可行性分析 2.1.3 法律可行性分析 2.2 系統功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系統用例分…

【python爬蟲】總結反反爬的技巧

1. 當請求失敗時重復請求 def get_url(url):try:response requests.get(url, timeout10) # 超時設置為10秒except:for i in range(10): # 循環去請求網站response requests.get(url, proxiesproxies, timeout20)if response.status_code 200:breakreturn response2. 適當…

C++ 教程 - 09 多線程處理

文章目錄 thread標準庫pthread庫 thread標準庫 C 11 后添加了新的標準線程庫 std::thread 類&#xff0c;需引入頭文件<thread>聲明即創建線程對象&#xff0c;如 thread th1&#xff1b; 調用無參構造&#xff0c;生成一個空的線程對象&#xff1b;thread th(callable&…