La concurrence est un outil puissant en programmation, permettant à plusieurs threads d'exécuter du code simultanément. Cependant, ce pouvoir s’accompagne de la responsabilité de gérer les ressources partagées en toute sécurité. Dans Ruby, Mutex (abréviation de exclusion mutuelle) est un élément clé pour garantir qu'un seul thread peut accéder à une ressource à la fois, évitant ainsi une corruption potentielle des données ou un comportement imprévisible.
Dans ce blog, nous explorerons comment utiliser Mutex dans Ruby, à l'aide d'exemples de code et d'un scénario réel pour illustrer son application pratique.
Un Mutex est un objet utilisé pour gérer la synchronisation des threads. Lorsqu'un thread verrouille un Mutex, tout autre thread qui tente de verrouiller le même Mutex sera mis en attente jusqu'à ce que le premier thread le libère. Ce mécanisme garantit que les sections critiques du code, où l'on accède aux ressources partagées, sont exécutées par un seul thread à la fois.
Imaginez un scénario dans lequel plusieurs threads modifient la même variable ou écrivent dans le même fichier. Sans une synchronisation appropriée, le résultat pourrait être imprévisible ou incorrect. Un Mutex permet d'éviter de tels problèmes en garantissant qu'un seul thread peut accéder à la ressource partagée à un moment donné.
require 'thread' # Initialize a Mutex mutex = Mutex.new # Shared resource counter = 0 # Create threads threads = 10.times.map do Thread.new do 1000.times do # Lock the mutex before modifying the shared resource mutex.synchronize do counter += 1 end end end end # Wait for all threads to finish threads.each(&:join) puts "Final counter value: #{counter}"
Pour comprendre l'application réelle de Mutex, considérons un scénario dans lequel plusieurs threads représentent des transactions sur un compte bancaire. Chaque transaction peut impliquer un dépôt ou un retrait d'argent, et nous devons nous assurer que le solde du compte reste exact.
require 'thread' # Initialize a Mutex account_mutex = Mutex.new # Bank account class class BankAccount attr_reader :balance def initialize(balance = 0) @balance = balance end def deposit(amount) @balance += amount end def withdraw(amount) @balance -= amount end end # Shared bank account account = BankAccount.new(1000) # Transactions threads = [] # Deposit thread threads << Thread.new do 100.times do account_mutex.synchronize do account.deposit(50) end end end # Withdraw thread threads << Thread.new do 100.times do account_mutex.synchronize do account.withdraw(30) end end end # Wait for all threads to finish threads.each(&:join) puts "Final account balance: #{account.balance}"
L'utilisation de Mutex dans Ruby est essentielle lorsqu'il s'agit de gestion simultanée et de ressources partagées. Il fournit un moyen simple mais efficace de garantir qu'un seul thread peut accéder à une section critique de code à la fois, évitant ainsi des problèmes potentiels tels que la corruption des données ou les conditions de concurrence.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!