線程同步——讀寫鎖

Linux——線程同步 讀寫鎖

目錄

一、基本概念

1.1 讀寫鎖的基本概念

1.2 讀寫鎖的優點

1.3 讀寫鎖的實現?

1.4 代碼實現


一、基本概念

線程同步中的讀寫鎖(Read-Write Lock),也常被稱為共享-獨占鎖(Shared-Exclusive Lock),是一種用于控制對共享資源的并發訪問的同步機制。它允許多個線程同時讀取共享資源,但只允許一個線程寫入共享資源。讀寫鎖的設計目的是在多線程環境中提高并發性能,特別是在讀操作遠多于寫操作的場景中。讀寫鎖與互斥鎖區別就是讀鎖和寫鎖是分開的

1.1 讀寫鎖的基本概念

讀寫鎖通常由兩個鎖組成:

  1. 讀鎖(Shared Lock)允許多個線程同時獲取讀鎖,這意味著多個線程可以同時讀取共享資源。當至少有一個線程持有讀鎖時,其他線程不能獲取寫鎖。

  2. 寫鎖(Exclusive Lock)只允許一個線程獲取寫鎖,這意味著在任何時刻只有一個線程可以寫入共享資源。當線程持有寫鎖時,其他線程既不能獲取讀鎖也不能獲取寫鎖。

1.2 讀寫鎖的優點

  1. 提高并發性:在讀取操作遠多于寫入操作的情況下,讀寫鎖可以顯著提高程序的并發性能,因為它允許多個線程同時讀取共享資源。

  2. 避免寫饑餓:由于寫鎖的優先級通常高于讀鎖,可以避免長時間只進行讀操作而使寫操作饑餓的情況。

  3. 靈活性:讀寫鎖提供了一種靈活的機制來控制對共享資源的訪問,可以根據實際需要選擇獲取讀鎖或寫鎖。

1.3 讀寫鎖的實現?

pthread_rwlock_init 初始化讀寫鎖

pthread_rwlock_rdlock?獲取(鎖定)一個讀寫鎖以進行讀取。

pthread_rwlock_wrlock?獲取(鎖定)一個讀寫鎖以進行寫入。

pthread_rwlock_unlock 釋放一個讀寫鎖 解鎖

pthread_rwlock_destroy 銷毀一個讀寫鎖

1.4 代碼實現

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>pthread_rwlock_t lock;//定義了一個變量lockvoid* fun1(void* arg)//模擬讀同時進行和2
{for(int i=0;i<20;i++){pthread_rwlock_rdlock(&lock);printf("fun1 read start:   \n");sleep(1);printf("fun1 read end:    \n");pthread_rwlock_unlock(&lock);sleep(1);}
}void* fun2(void* arg)//讀
{for(int i=0;i<10;i++){pthread_rwlock_rdlock(&lock);printf("fun2 read start:   \n");sleep(1);printf("fun2 read end:    \n");pthread_rwlock_unlock(&lock);sleep(1);}
}void* fun3(void* arg)//寫 只允許一個進行
{for(int i=0;i<8;i++){pthread_rwlock_wrlock(&lock);sleep(1);printf("    fun3 write start:   \n");sleep(1);printf("    fun3 write end:     \n");pthread_rwlock_unlock(&lock);sleep(1);}
}
int main()
{pthread_rwlock_init(&lock,NULL);pthread_t id1,id2,id3;pthread_create(&id1,NULL,fun1,NULL);pthread_create(&id2,NULL,fun2,NULL);pthread_create(&id3,NULL,fun3,NULL);pthread_join(id1,NULL);pthread_join(id2,NULL);pthread_join(id3,NULL);pthread_rwlock_destroy(&lock);
}

讀寫鎖允許多個線程同時讀取共享資源,但只允許一個線程寫入共享資源。

  • 這里定義了一個全局的讀寫鎖lock,用于控制對共享資源的訪問。

  • 這段代碼通過使用讀寫鎖來同步多個線程對共享資源的訪問。讀線程可以同時訪問共享資源,而寫線程則需要獨占訪問。通過這種方式,可以有效地提高程序的并發性能,特別是在讀操作遠多于寫操作的場景中。

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

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

相關文章

全面解析PRN文件:從原理到可視化的完整指南 【標簽打印】

文章目錄 一、PRN文件概述二、PRN文件結構深度解析2.1 文件頭配置2.1 繪圖指令詳解2.3 文本處理方案2.4 條碼/二維碼實現2.5 RFID指令集 三、實戰&#xff1a;PRN可視化工具開發3.1 基于Canvas的實現方案3.2 坐標轉換關鍵算法 四、常見問題解決方案4.1 內容偏移問題4.2 中文亂碼…

C++:函數(通識版)

一、函數的基礎 1.什么是函數&#xff1f;&#xff08;獨立的功能單位&#xff09; 函數是C中封裝代碼邏輯的基本單元&#xff0c;用于執行特定任務。 作用&#xff1a;代碼復用、模塊化、提高可讀性。 2、函數的基本結構 返回類型 函數名(參數列表) {// 函數體return 返回值…

sql注入語句學習

說明 注入漏洞作為登頂過web十大漏洞多次的漏洞&#xff0c;危害性不言而喻&#xff0c;其中sql注入就是注入漏洞常用的手段。其形成的原因是由于web在接收傳參數據時&#xff0c;對數據的過濾不夠嚴格&#xff0c;將其帶入到數據庫查詢中&#xff0c;導致用戶可以通過傳參一些…

云鑰科技多通道工業相機解決方案設計

項目應用場景分析與需求挑戰 1. 應用場景 ?目標領域?&#xff1a;工業自動化檢測&#xff08;如精密零件尺寸測量、表面缺陷檢測&#xff09;、3D立體視覺&#xff08;如物體建模、位姿識別&#xff09;、動態運動追蹤&#xff08;如高速生產線監控&#xff09;等。 ?核心…

離散的數據及參數適合用什么算法做模型

離散數據和參數適用的機器學習算法取決于具體任務(分類、回歸、聚類等)、數據特點(稀疏性、類別數量等)以及業務需求。以下是針對離散數據的常用算法分類和選擇建議: 1. 分類任務(離散目標變量) 經典算法 決策樹(ID3/C4.5/CART) 直接處理離散特征,無需編碼,可解釋性…

VMware 安裝 Ubuntu 實戰分享

VMware 安裝 Ubuntu 實戰分享 VMware 是一款強大的虛擬機軟件&#xff0c;廣泛用于多操作系統環境的搭建。本文將詳細介紹如何在 VMware 中安裝 Ubuntu&#xff0c;并分享安裝過程中的常見問題及解決方法。 1. 安裝前的準備工作 (1) 系統要求 主機操作系統&#xff1a;Windo…

基于Promise鏈式調用的多層級請求性能優化

代碼優化-循環嵌套關聯請求 1. 背景 在實際開發中&#xff0c;我們經常會遇到需要嵌套關聯請求的場景&#xff0c;比如&#xff1a; 獲取項目列表獲取項目詳情獲取項目進度 2. 問題 在這種場景下&#xff0c;我們可能會遇到以下問題&#xff1a; 串行請求瀑布流&#xff…

puppeteer+express服務端導出頁面為pdf

以下是開發步驟&#xff1a; 1、創建目錄 puppeteer_demo 目錄&#xff0c;打開目錄 初始化項目&#xff08;命令為&#xff1a;npm init -y&#xff09; 頁面如&#xff1a; 初始化后&#xff0c;項目目錄會出現 package.json 文件 2、安裝 puppeteer &#xff0c;使用命令&a…

GPT-4o圖像生成功能:技術突破與隱憂并存

2025年3月25日&#xff0c;OpenAI正式推出GPT-4o原生圖像生成功能&#xff0c;宣稱其實現了“文本到圖像的終極跨越”。然而&#xff0c;這一被市場追捧的技術在短短72小時內便因用戶需求過載觸發限流&#xff0c;暴露出算力瓶頸與商業化矛盾的尖銳性。這場技術狂歡的背后&…

西域平臺商品詳情接口設計與實現?

接口描述&#xff1a; 該接口用于獲取西域平臺中指定商品的詳細信息&#xff0c;包括商品名稱、價格、庫存、描述、圖片等。 點擊獲取key和secret 接口地址&#xff1a; GET /api/product/detail 請求參數&#xff1a; 參數名 類型 是否必填 描述 productId st…

項目-蒼穹外賣(十五) Apache ECharts+數據統計

一、介紹 二、營業額統計 需求分析和設計&#xff1a; Controller: Service: /*** 營業額統計* param begindate* param enddate* return* */Overridepublic TurnoverReportVO turnoverStatistics(LocalDate begindate, LocalDate enddate) {//創建時間集合List<LocalDate&…

Postgresql導出及導入符合條件的記錄

Postgresql導出及導入符合條件的記錄 Export specific rows from a PostgreSQL table as INSERT SQL script 首先進入psql。 切換到指定資料庫後將資料表中符合條件的記錄導出成csv檔&#xff1a; \c <dbname>; COPY (SELECT * FROM <tablename> WHERE <cond…

體育比分網站開發避坑指南:如何選擇靠譜的數據服務商?(10年行業經驗總結,避免踩坑!)

作為一家專業的體育比分數據服務商&#xff0c;我們接觸過大量客戶&#xff0c;發現很多人在開發體育比分網站或接入數據API時&#xff0c;由于選擇不靠譜的服務商&#xff0c;導致項目延期、數據延遲、售后無響應、隱性收費等問題&#xff0c;最終影響運營效果&#xff0c;甚至…

離心萃取機在畢赤酵母萃取中的應用

在生物醫藥領域&#xff0c;畢赤酵母因其高效表達重組蛋白的能力&#xff0c;成為基因工程的“明星宿主”。然而&#xff0c;如何從復雜的發酵體系中高效提取目標產物&#xff0c;一直是行業痛點。離心萃取機的出現&#xff0c;憑借其高速分離、精準提純的特性&#xff0c;正在…

CNN和LSTM的計算復雜度分析

前言&#xff1a;今天做邊緣計算的時候&#xff0c;在評估模型性能的時候發現NPU計算的大部分時間都花在了LSTM上&#xff0c;使用的是Bi-LSTM&#xff08;耗時占比98%&#xff09;&#xff0c;CNN耗時很短&#xff0c;不禁會思考為什么LSTM會花費這么久時間。 首先聲明一下實…

StarRocks 中 CURRENT_TIMESTAMP 和 current_time 分區過濾問題

背景 本文基于Starrocks 3.3.5 最近在進行Starrocks 跑數據的時候&#xff0c;發現了一個SQL 掃描了所有分區的數據&#xff0c;簡化后的SQL如下&#xff1a; select date_created from tableA where date_createddate_format(current_time(), %Y-%m-%d %H:%i:%S) limit 20其…

從物理學到機器學習:用技術手段量化分析職場被動攻擊行為

從物理學到機器學習:用技術手段量化分析職場被動攻擊行為 1. 從物理系統視角看團隊協作 1.1 團隊系統的能量模型 在熱力學系統中,系統的總能量由動能和勢能組成。類比到團隊協作中,我們可以建立如下模型: class TeamEnergy:def __init__(self, members):self.kinetic = …

Pytroch搭建全連接神經網絡識別MNIST手寫數字數據集

編寫步驟 之前已經記錄國多次的編寫步驟了&#xff0c;無需多言。 &#xff08;1&#xff09;準備數據集 這里我們使用MNIST數據集&#xff0c;有官方下載渠道。我們直接使用torchvison里面提供的數據讀取功能包就行。如果不使用這個&#xff0c;自己像這樣子構建也一樣。 # …

Java 基本數據類型 vs 包裝類(引用數據類型)

一、核心概念對比&#xff08;以 int vs Integer 為例&#xff09; 特性基本數據類型&#xff08;int&#xff09;包裝類&#xff08;Integer&#xff09;數據類型原始值&#xff08;Primitive Value&#xff09;對象&#xff08;Object&#xff09;默認值0null內存位置棧&…

什么是 強化學習(RL):以DQN、PPO等經典模型

什么是 強化學習(RL):以DQN、PPO等經典模型 DQN(深度 Q 網絡)和 PPO(近端策略優化)共同屬于強化學習(Reinforcement Learning,RL)這一領域。強化學習是機器學習中的一個重要分支,其核心在于智能體(Agent)通過與環境進行交互,根據環境反饋的獎勵信號來學習最優的…