C# 編程中互斥鎖的使用

C# 中的互斥鎖

互斥鎖是 C# 中使用的同步原語,用于控制多個線程或進程對共享資源的訪問。其目的是確保在任何給定時間只有一個線程或進程可以獲取互斥鎖,從而提供互斥。

C# 中互斥鎖的優點

可以使用互斥鎖 (Mutex) 并享受其帶來的好處。

1. 共享資源的獨占訪問

  • 場景:多個線程或進程需要獨占訪問共享資源(例如文件、數據庫或硬件設備)的情況。
  • 示例:考慮一個多線程應用程序,其中多個線程需要同時寫入共享日志文件。
  • 好處: 利用互斥鎖,可以保證一次只有一個線程或進程可以訪問資源,從而防止數據損壞或競爭條件。

2.跨進程同步

  • 場景:不同進程中運行的線程之間需要同步。
  • 示例:協調多個進程對共享內存映射文件的訪問。
  • 好處:互斥鎖可以被命名并在整個系統范圍內使用,從而實現跨進程邊界的同步。

3. 關鍵部分保護

  • 場景:代碼的關鍵部分需要防止被多個線程并發執行的情況。
  • 示例:考慮一個緩存實現,其中添加或刪除項目必須是線程安全的。
  • 好處:通過使用互斥鎖,它有助于對關鍵部分的訪問進行序列化,確保一次只有一個線程執行受保護的代碼,從而避免競爭條件。

4. 資源池化

  • 場景:管理對有限資源池(例如數據庫連接或網絡套接字)的訪問時。
  • 示例:多個線程競爭可用連接的連接池。
  • 好處:可以使用互斥鎖 (Mutex) 來控制對池的訪問,從而保證同時使用的用戶數量不超過池的容量。

5.避免死鎖

  • 場景:在多個同步原語一起使用以防止發生死鎖的情況下。
  • 示例:實現一個需要原子鎖定多個資源的事務系統。
  • 好處:互斥鎖可以參與死鎖避免策略,有助于防止死鎖情況的發生。

互斥鎖的實現

步驟1.

使用Xaml View測試所有情況。

<Window x:Class="MutexExample.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:MutexExample"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><StackPanel Orientation="Vertical"><Button x:Name="BtnSR" Height="30" Content="Shared Resource" Margin="10" Click="BtnSR_Click"/><Button x:Name="BtnCPS" Height="30" Content="Cross-Process Synchronization" Margin="10" Click="BtnCPS_Click"/><Button x:Name="BtnCSP" Height="30" Content="Critical Section Protection" Margin="10" Click="BtnCSP_Click"/><Button x:Name="BtnRP" Height="30" Content="Resource Pooling" Margin="10" Click="BtnRP_Click"/><Button x:Name="BtnDLA" Height="30" Content="Deadlock Avoidance" Margin="10" Click="BtnDLA_Click"/></StackPanel></Grid>
</Window>

后端編程

using System;
using System.Threading;
using System.Windows;namespace MutexExample
{public partial class MainWindow : Window{Mutex mutex = new Mutex();static int availableResources = 3;public MainWindow(){InitializeComponent();}private void SharedResourceAccess(object id){mutex.WaitOne(); // Acquire the mutextry{Console.WriteLine($"Thread {id} is accessing the shared resource...");// Simulate some workThread.Sleep(2000);}finally{mutex.ReleaseMutex(); // Release the mutex}}private void BtnSR_Click(object sender, RoutedEventArgs e){// Create multiple threads accessing the shared resourcefor (int i = 0; i < 5; i++){Thread thread = new Thread(SharedResourceAccess);thread.Start(i);}}private void BtnCPS_Click(object sender, RoutedEventArgs e){// Acquire the mutexif (mutex.WaitOne(TimeSpan.FromSeconds(5))){try{Console.WriteLine("Process 1 has acquired the mutex.");Console.ReadLine(); // Hold the mutex until Enter is pressed}finally{mutex.ReleaseMutex(); // Release the mutex}}else{Console.WriteLine("Process 1 failed to acquire the mutex.");}}private void CriticalSectionAccess(object id){mutex.WaitOne(); // Acquire the mutextry{Console.WriteLine($"Thread {id} is executing the critical section...");// Simulate some workThread.Sleep(2000);}finally{mutex.ReleaseMutex(); // Release the mutex}}private void BtnCSP_Click(object sender, RoutedEventArgs e){// Create multiple threads accessing a critical sectionfor (int i = 0; i < 5; i++){Thread thread = new Thread(CriticalSectionAccess);thread.Start(i);}}private void ResourceAccess(object id){mutex.WaitOne(); // Acquire the mutextry{if (availableResources > 0){availableResources--;Console.WriteLine($"Thread {id} acquired a resource. Remaining resources: {availableResources}");// Simulate some workThread.Sleep(2000);availableResources++;}else{Console.WriteLine($"Thread {id} could not acquire a resource. No resources available.");}}finally{mutex.ReleaseMutex(); // Release the mutex}}private void BtnRP_Click(object sender, RoutedEventArgs e){// Create multiple threads to access the resource poolfor (int i = 0; i < 5; i++){Thread thread = new Thread(ResourceAccess);thread.Start(i);}}private void BtnDLA_Click(object sender, RoutedEventArgs e){Thread thread1 = new Thread(Thread1);Thread thread2 = new Thread(Thread2);thread1.Start();thread2.Start();thread1.Join();thread2.Join();}private Mutex mutex1 = new Mutex();private Mutex mutex2 = new Mutex();private void Thread1(){mutex1.WaitOne();Console.WriteLine("Thread 1 acquired mutex1");Thread.Sleep(1000);mutex2.WaitOne();Console.WriteLine("Thread 1 acquired mutex2");mutex2.ReleaseMutex();mutex1.ReleaseMutex();}private void Thread2(){mutex2.WaitOne();Console.WriteLine("Thread 2 acquired mutex2");Thread.Sleep(1000);mutex1.WaitOne();Console.WriteLine("Thread 2 acquired mutex1");mutex1.ReleaseMutex();mutex2.ReleaseMutex();}}
}

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

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

相關文章

德國威步的技術演進之路(下):從云端許可管理到硬件加密狗的創新

從單機用戶許可證到WkNET網絡浮點授權的推出&#xff0c;再到引入使用次數和豐富的時間許可證管理&#xff0c;德國威步產品不斷滿足市場對靈活性和可擴展性的需求。TCP/IP浮動網絡許可證進一步展示了威步技術在網絡時代的創新應用。借助于2009年推出的借用許可證以及2015年推出…

mac磁盤工具如何合并分區 macos 磁盤工具 無法抹除 磁盤管理軟件哪個使用率最高

一、什么是NTFS格式分區 NTFS格式分區是微軟公司開發的諸多文件系統中的一種。NTFS格式分區是一種文件系統&#xff0c;磁盤只有在安裝了文件系統后才能被正常使用&#xff0c;文件系統的格式有非常多&#xff0c;常見的有FAT 32和NTFS。 作為常見文件系統&#xff0c;NTFS格式…

無人機集群協同搜索研究綜述

源自&#xff1a;指揮控制與仿真 作者&#xff1a;劉圣洋, 宋婷, 馮浩龍, 孫玥, 韓飛 注&#xff1a;若出現無法顯示完全的情況&#xff0c;可 V 搜索“人工智能技術與咨詢”查看完整文章 摘要 無人機集群協同區域搜索能夠有效地獲取任務區域地面信息,降低環境不確定度。基…

買賣股票的最佳時期含冷凍期(leetcode)

個人主頁&#xff1a;Lei寶啊 愿所有美好如期而遇 也就有這樣的狀態轉移方程&#xff1a; 買入&#xff1a;dp[i][0] max(dp[i-1][1] - prices[i], dp[i-1][0]); 可買入&#xff1a;dp[i][1] max(dp[i-1][1], dp[i-1][2]); 冷凍期&#xff1a;dp[i][2] dp[i-1][0] prices…

使用ChatGPT自動生成測試用例思維導圖

使用ChatGPT自動生成測試用例思維導圖 引言ChatGPT在測試用例編寫中的應用全面覆蓋測試場景邊界測試避免測試用例重復 借助ChatGPT生成測試用例思維導圖準備工作步驟一&#xff1a;與ChatGPT對話步驟二&#xff1a;生成思維導圖代碼 結語 引言 在編寫測試用例時&#xff0c;測…

基于Python Django的房價數據分析平臺,包括大屏和后臺數據管理,有線性、向量機、梯度提升樹、bp神經網絡等模型

背景 隨著城市化進程的加速和房地產市場的快速發展&#xff0c;房價已成為經濟學、社會學等多學科交叉研究的熱點問題。為了更精確地分析和預測房價&#xff0c;數據分析和機器學習技術被廣泛應用。在此背景下&#xff0c;開發一個基于Python Django的房價數據分析平臺具有重要…

職業技能大賽引領下物聯網專業實訓教學的改革研究

隨著物聯網技術的迅猛發展&#xff0c;作為培養高技能應用型人才的高職院校&#xff0c;面臨著將理論與實踐深度結合&#xff0c;以滿足行業對物聯網專業人才新要求的挑戰。職業技能大賽作為一種重要的教育評價與促進機制&#xff0c;為物聯網專業實訓教學的改革提供了新的視角…

面試題004-Java-Java多線程(下)

面試題004-Java-Java多線程(下) 這里寫目錄標題 面試題004-Java-Java多線程(下)題目自測題目答案1. synchronized 關鍵字的作用&#xff1f;2. volatile 關鍵字的作用&#xff1f;3. synchronized 和 volatile 的區別&#xff1f;4. synchronized 和 ReentrantLock 的區別&…

成人高考本科何時報名-深職訓學校幫您規劃學習之路

你有想過繼續深造自己的學歷嗎&#xff1f;也許你已經工作多年&#xff0c;但總覺得學歷是一塊心病&#xff0c;想要通過成人高考本科來提升自己。不用著急&#xff0c;今天我們來聊一聊成人高考本科的報名時間&#xff0c;以及深職訓學校如何幫助你順利完成報名。 深圳成人高…

LeetCode-刷題記錄-滑動窗口合集(本篇blog會持續更新哦~)

一、滑動窗口概述 滑動窗口&#xff08;Sliding Window&#xff09;是一種用于解決數組&#xff08;或字符串&#xff09;中子數組&#xff08;或子串&#xff09;問題的有效算法。 Sliding Window核心思想&#xff1a; 滑動窗口技術的基本思想是維護一個窗口&#xff08;一般…

怎樣在Python中使用oobabooga的API密鑰,通過端口5000獲取模型列表的授權

題意&#xff1a; oobabooga-textgen-web-ui how to get authorization to view model list from port 5000 via the oobas api-key in python 怎樣在Python中使用oobabooga的API密鑰&#xff0c;通過端口5000獲取模型列表的授權 問題背景&#xff1a; I wish to extract an…

fastapi+vue3前后端分離開發第一個案例整理

開發思路 1、使用fastapi開發第一個后端接口 2、使用fastapi解決cors跨域的問題。cors跨域是瀏覽器的問題&#xff0c;只要使用瀏覽器&#xff0c;不同IP或者不同端口之間通信&#xff0c;就會存在這個問題。前后端分離是兩個服務&#xff0c;端口不一樣&#xff0c;所以必須要…

PCA和PCoA分析的python代碼

主成分分析(PCA)和主坐標分析(PCoA)都是數據降維和可視化的常用方法,但它們在適用場景和計算方法上有一些重要區別。 主成分分析(PCA) 定義: PCA是一種線性降維方法,通過正交變換將原始數據轉化為一組線性不相關的變量(主成分)。這些主成分是數據中方差最大的方向。…

XLSX + LuckySheet + LuckyExcel實現前端的excel預覽

文章目錄 功能簡介簡單代碼實現效果參考 功能簡介 通過LuckyExcel的transformExcelToLucky方法&#xff0c; 我們可以把一個文件直接轉成LuckySheet需要的json字符串&#xff0c; 之后我們就可以用LuckySheet預覽excelLuckyExcel只能解析xlsx格式的excel文件&#xff0c;因此對…

.NET 漏洞分析 | 某ERP系統存在SQL注入

01閱讀須知 此文所提供的信息只為網絡安全人員對自己所負責的網站、服務器等&#xff08;包括但不限于&#xff09;進行檢測或維護參考&#xff0c;未經授權請勿利用文章中的技術資料對任何計算機系統進行入侵操作。利用此文所提供的信息而造成的直接或間接后果和損失&#xf…

Java中s-EJB 與 e-EJB的區別

在Java中&#xff0c;關于“s-EJB”與“e-EJB”的區分&#xff0c;實際上可能存在一定的誤解或混淆&#xff0c;因為在標準的EJB&#xff08;Enterprise JavaBeans&#xff09;術語中&#xff0c;并沒有直接稱為“s-EJB”和“e-EJB”的明確分類。然而&#xff0c;為了嘗試解答這…

【Postman gRPC測試全攻略】探索微服務通信的新紀元

標題&#xff1a;【Postman gRPC測試全攻略】探索微服務通信的新紀元 gRPC是一種高性能、開源和通用的RPC框架&#xff0c;由Google主導開發&#xff0c;它使用Protocol Buffers作為接口描述語言和消息交換格式。Postman作為API開發的利器&#xff0c;也提供了對gRPC服務的測試…

封裝2個函數

1 #include "key1.h"2 //封裝EXTI章節函數3 void hal_exti_init(int exti,unsigned int i)4 {5 switch(exti)6 {7 case 9:8 //使能GPIOF外設時鐘9 RCC->MP_AHB4ENSETR | (0x1<<5);10 //將PF9設置為輸出模式11 …

MyBatis(22)如何在 MyBatis 中使用注解而不是 XML 映射文件

在 MyBatis 中&#xff0c;使用注解而不是 XML 映射文件來進行 SQL 映射是一種更為簡潔直觀的方式&#xff0c;尤其適用于 SQL 語句較少的場景。通過注解&#xff0c;開發者可以直接在接口方法上聲明 SQL 語句&#xff0c;這樣可以減少項目中的配置文件數量&#xff0c;使得項目…

學習筆記——動態路由——OSPF(認證)

十二、OSPF鄰居認證 1、OSPF鄰居認證概述 鏈路是路由器接口的另一種說法&#xff0c;因此OSPF也稱為接口狀態路由協議。OSPF通過路由器之間通告網絡接口的狀態來建立鏈路狀態數據庫&#xff0c;生成最短路徑樹&#xff0c;每個OSPF路由器使用這些最短路徑構造路由表。 OSPF認…