linux學習第30天(線程同步和鎖)

線程同步

????????協同步調,對公共區域數據按序訪問。防止數據混亂,產生與時間有關的錯誤。

數據混亂的原因

  1. 資源共享(獨享資源則不會)

  2. 調度隨機(意味著數據訪問會出現競爭)

  3. 線程間缺乏必要同步機制

鎖的使用

????????建議鎖!對公共數據進行保護。所有線程【應該】在訪問公共數據前先拿鎖再訪問。但,鎖本身不具備強制性。

主要應用函數:

??? pthread_mutex_init?????? 函數:創建鎖

??? pthread_mutex_destory??? 函數:初始化

??? pthread_mutex_lock?????? 函數:加鎖

??? pthread_mutex_trylock??? 函數:

??? pthread_mutex_unlock???? 函數:解鎖

以上5個函數的返回值都是:成功返回0,失敗返回錯誤號

、、、、、、、、、、、

pthread_mutex_t 類型,其本質是一個結構體。為簡化理解,應用時可忽略其實現細節,簡單當成整數看待

pthread_mutex_t mutex;變量mutex只有兩種取值:0,1

、、、、、、、

使用mutex(互斥量、互斥鎖)一般步驟:

??? pthread_mutex_t 類型。

??? 1. pthread_mutex_t lock;? 創建鎖

??? 2? pthread_mutex_init; 初始化????? 1

??? 3. pthread_mutex_lock;加鎖????? 1-- --> 0

??? 4. 訪問共享數據(stdout)???

??? 5. pthrad_mutext_unlock();解鎖???? 0++ --> 1

??? 6. pthead_mutex_destroy;銷毀鎖

、、、、、、、、、、、

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr)

這里的restrict關鍵字,表示指針指向的內容只能通過這個指針進行修改

restrict關鍵字:

??? 用來限定指針變量。被該關鍵字限定的指針變量所指向的內存操作,必須由本指針完成。

初始化互斥量:

?????? pthread_mutex_t mutex;

?????? 1. pthread_mutex_init(&mutex, NULL);?? ?????? ??? 動態初始化。

?????? 2. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;? 靜態初始化。

例子:借助互斥鎖管理共享數據實現同步

未加鎖

加鎖

互斥鎖使用技巧

注意事項:

?????? 盡量保證鎖的粒度, 越小越好。(訪問共享數據前,加鎖。訪問結束【立即】解鎖。)

?????? 互斥鎖,本質是結構體。 我們可以看成整數。 初值為 1。(pthread_mutex_init() 函數調用成功。)

?????? 加鎖: --操作, 阻塞線程。

?????? 解鎖: ++操作, 喚醒阻塞在鎖上的線程。

?????? try鎖:嘗試加鎖,成功--。失敗,返回。同時設置錯誤號 EBUSY

死鎖

是使用鎖不恰當導致的現象:

?????? 1. 對一個鎖反復lock。

?????? 2. 兩個線程,各自持有一把鎖,請求另一把。

第一種情況,反復加鎖;

第二種情況,1先拿A鎖,2先拿B鎖,1又要拿B,2又要拿A,就都在這阻塞等待。

讀寫鎖

特性:

  1. 讀寫鎖是“寫模式加鎖”時, 解鎖前,所有對該鎖加鎖的線程都會被阻塞。
  2. 讀寫鎖是“讀模式加鎖”時, 如果線程以讀模式對其加鎖會成功;如果線程以寫模式加鎖會阻塞。
  3. 讀寫鎖是“讀模式加鎖”時, 既有試圖以寫模式加鎖的線程,也有試圖以讀模式加鎖的線程。那么讀寫鎖會阻塞隨后的讀模式鎖請求。優先滿足寫模式鎖。讀鎖、寫鎖并行阻塞,寫鎖優先級高

??????? 讀寫鎖也叫共享-獨占鎖。當讀寫鎖以讀模式鎖住時,它是以共享模式鎖住的;當它以寫模式鎖住時,它是以獨占模式鎖住的。寫獨占、讀共享。

??????? 讀寫鎖非常適合于對數據結構讀的次數遠大于寫的情況。

、、、、、、、、、、、、

??? 鎖只有一把。以讀方式給數據加鎖——讀鎖。以寫方式給數據加鎖——寫鎖。

??? 讀共享,寫獨占。

??? 寫鎖優先級高。(兩個寫,一個讀,等兩個寫結束再讀)

??? 相較于互斥量而言,當讀線程多的時候,提高訪問效率

??? pthread_rwlock_t? rwlock;

??? pthread_rwlock_init(&rwlock, NULL);

??? pthread_rwlock_rdlock(&rwlock);??? try

??? pthread_rwlock_wrlock(&rwlock);??? try

??? pthread_rwlock_unlock(&rwlock);

??? pthread_rwlock_destroy(&rwlock);

以上函數都是成功返回0,失敗返回錯誤號。

pthread_rwlock_t 類型??? 用于定義一個讀寫鎖變量

pthread_rwlock_t? rwlock

例子

3個線程不定時?""?全局資源,5個線程不定時?""?同一全局資源

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

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

相關文章

JavaScript中的系統對話框:alert、confirm、prompt

JavaScript中的系統對話框:alert、confirm、prompt 在Web開發的世界里,JavaScript始終扮演著“橋梁”的角色——它連接用戶與網頁,讓靜態的頁面煥發活力。而在這座橋梁上,系統對話框(System Dialogs)是最基…

圓冪定理深度探究——奧數專題講義

圓冪定理深度探究——奧數專題講義 開篇語:幾何中的"隱藏等式" 在平面幾何的星空中,圓與直線的交點仿佛散落的珍珠,而連接這些珍珠的線段之間,藏著一組令人驚嘆的等量關系。當我們用直尺測量、用邏輯推導時,…

一文看懂顯示接口:HDMI / DP / VGA / USB-C 有什么區別?怎么選?

剛買的新顯示器,插上線卻發現畫面糊成馬賽克?游戲打到關鍵時刻突然黑屏?4K電影看著看著就卡頓?別急!這些問題很可能都是"接口沒選對"惹的禍!今天我們就來徹底搞懂HDMI、DP、VGA、USB-C這些常見的…

【ARM嵌入式匯編基礎】- 操作系統基礎(二)

操作系統基礎(二) 文章目錄 操作系統基礎(二)6、線程7、進程內存管理8、內存頁9、內存保護10、匿名內存和內存映射內存11、內存映射文件和模塊6、線程 程序首次啟動時,會創建一個新進程,并為該程序分配一個線程。該初始線程負責初始化進程并最終調用程序中的主函數。多線…

C#調用Matlab生成的DLL

C#調用Matlab生成的DLL 1.Matlab生成DLL文件1.1準備腳本文件1.2.輸出DLL文件2.Winform項目中調用DLL2.1.創建Winform項目2.2.添加引用2.3.調用DLL2.3.1. 方法12.3.2. 方法22.4.配置CPU3.運行測試4.缺點1.Matlab生成DLL文件 1.1準備腳本文件 在Matlab環境下創建腳本文件calcul…

Julia爬取數據能力及應用場景

Julia 是一種高性能編程語言,特別適合數值計算和數據分析。然而,關于數據爬取(即網絡爬蟲)方面,我們需要明確以下幾點:雖然它是一門通用編程語言,但它的強項不在于網絡爬取(Web Scra…

Java03 二維數組|方法

一、聲明數組和初始化(掌握)數據類型[] 數組名 ; 數據類型 數組名[] ;靜態初始化數據類型[] 數組名 {元素1,元素2,元素3};動態初始化數據類型[] 數組名 new 數據類型[5]; 數組名[0] 元素1;二、數組的內存結構(掌握)package…

1. JVM介紹和運行流程

1. jvm是什么JVM(Java Virtual Machine)是 Java 程序的運行環境,它是 Java 技術的核心組成部分,負責執行編譯后的 Java 字節碼(.class文件)。jvm 說白了就是虛擬機,一個專門運行java字節碼文件的…

Spring Cloud Gateway 的路由和斷言是什么關系?

1. 基本概念 路由是 Spring Cloud Gateway 的基本組成單元。它定義了從客戶端接收到的請求應該被轉發到哪個目標服務。一個完整的路由通常包含以下幾個要素: ID (id):路由的唯一標識符。目標 URI (uri):請求最終要被轉發到的后端服務地址。斷…

線程屬性設置全攻略

目錄 一、線程屬性的概念 二、線程屬性的核心函數 1. 初始化與銷毀線程屬性對象 2. 常用屬性設置函數 三、線程屬性的設置示例 1. 設置線程為分離狀態 2. 設置線程棧大小 3. 設置線程調度策略和優先級 四、線程屬性的關鍵注意事項 1. 分離狀態(Detached S…

蒼穹外賣-day06

蒼穹外賣-day06 課程內容 HttpClient微信小程序開發微信登錄導入商品瀏覽功能代碼 學習目標 能夠使用HttpClient發送HTTP請求并解析響應結果 了解微信小程序開發過程 掌握微信登錄的流程并實現功能代碼 了解商品瀏覽功能需求 功能實現:微信登錄、商品瀏覽 1. H…

安卓定制功能

未解決的定制功能 1.創建自定義分區 2.通過服務啟動應用進程 3.應用白名單 4.網絡白名單 5.應用鎖 6.默認launcher 7.多主頁動態切換 8.禁止狀態欄下拉/鎖屏頁面禁止下拉狀態欄(兩種一起) 9.導航欄動態打開關閉 10.固件默認是手勢還是導航欄 11.狀態欄動…

【項目】GraphRAG基于知識圖譜的檢索增強技術-實戰入門

GraphRAG—基于知識圖譜的檢索增強技術(一)GraphRAG入門介紹(二)GraphRAG基本原理回顧(三)GraphRAG運行流程3.1 索引(Indexing)過程3.2 查詢(Query)過程3.3 P…

Zookeeper添加SASL安全認證 修復方案

#作者:任少近 文章目錄1修復背景2 修復方案說明3 配置流程3.1停止zookeeper服務3.2Zookeeper添加SASL參數3.3配置jaas密碼文件3.4 添加啟動參數3.5啟動zookeeper服務3.6訪問測試4 Kafka連接zookeeper服務端配置4.1未配置身份認證4.2停止kafka服務4.3配置身份認證4.4…

AI進化論07:第二次AI寒冬——AI“改頭換面”,從“AI”變成“機器學習”

書接上回,上回咱們聊了神經網絡在第一次寒冬中的“蟄伏”與“萌動”。但別高興太早,AI很快就迎來了它的第二次“寒冬”(大概從20世紀80年代末到90年代中期)。這次寒冬啊,比第一次還“冷”,還“漫長”。AI這…

基于開源AI智能名片鏈動2+1模式與S2B2C商城小程序的渠道選擇策略研究

摘要:在數字化商業環境下,品牌與產品的渠道選擇對其市場推廣和運營成功至關重要。本文聚焦于如何依據自身品牌和產品特性,結合開源AI智能名片鏈動21模式與S2B2C商城小程序,運用科學的渠道選擇方法,慎重挑選1 - 2個適宜…

開源 C# .net mvc 開發(八)IIS Express輕量化Web服務器的配置和使用

文章的目的為了記錄.net mvc學習的經歷。本職為嵌入式軟件開發,公司安排開發文件系統,臨時進行學習開發,系統上線3年未出沒有大問題。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。 相關鏈接: 開源 C# .net mvc 開…

PostgreSQL安裝及簡單應用

下載地址:EDB: Open-Source, Enterprise Postgres Database Management 安裝 注意:端口號默認是5432 配置dbeaver應用,創建數據庫和表 -- 創建模式(如果不存在) CREATE SCHEMA IF NOT EXISTS bbbase;-- 創建序列&…

wedo智能車庫-----第31節(免費分享圖紙)

夸克網盤:https://pan.quark.cn/s/10302f7bbae0 高清圖紙源文件,需要的請自取

【springboot】IDEA創建SpringBoot簡單工程(有插件)

需求 使用SpringBoot開發一個web應用,瀏覽器發起請求/hello后,給瀏覽器返回字符串 hello world~ 步驟 1.創建Maven工程 2.導入spring-boot-stater-web起步依賴 3.編寫controller 4.提供啟動類 pom.xml文件了解 啟動類 新建包 創建類 package com.zw…