Concurrency ialah alat yang berkuasa dalam pengaturcaraan, membolehkan berbilang rangkaian untuk melaksanakan kod secara serentak. Walau bagaimanapun, dengan kuasa ini datang tanggungjawab untuk menguruskan sumber yang dikongsi dengan selamat. Dalam Ruby, Mutex (singkatan untuk pengecualian bersama) ialah komponen utama dalam memastikan bahawa hanya satu urutan boleh mengakses sumber pada satu masa, menghalang potensi rasuah data atau tingkah laku yang tidak dapat diramalkan.
Dalam blog ini, kami akan meneroka cara menggunakan Mutex dalam Ruby, disokong oleh kod sampel dan senario kehidupan sebenar untuk menggambarkan aplikasi praktikalnya.
Mutex ialah objek yang digunakan untuk mengurus penyegerakan benang. Apabila satu benang mengunci Mutex, mana-mana benang lain yang cuba mengunci Mutex yang sama akan ditahan sehingga benang pertama melepaskannya. Mekanisme ini memastikan bahagian kod kritikal, tempat sumber dikongsi diakses, dilaksanakan hanya dengan satu urutan pada satu masa.
Bayangkan senario di mana berbilang benang mengubah suai pembolehubah yang sama atau menulis ke fail yang sama. Tanpa penyegerakan yang betul, hasilnya mungkin tidak dapat diramalkan atau tidak betul. Mutex membantu mengelakkan isu sedemikian dengan memastikan hanya satu utas boleh mengakses sumber yang dikongsi pada bila-bila masa.
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}"
Untuk memahami aplikasi sebenar Mutex, mari kita pertimbangkan senario di mana berbilang rangkaian mewakili transaksi pada akaun bank. Setiap transaksi mungkin melibatkan deposit atau pengeluaran wang, dan kami mesti memastikan baki akaun kekal tepat.
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}"
Menggunakan Mutex dalam Ruby adalah penting apabila berurusan dengan konkurensi dan sumber yang dikongsi. Ia menyediakan cara yang mudah tetapi berkesan untuk memastikan bahawa hanya satu urutan boleh mengakses bahagian kod yang kritikal pada satu-satu masa, menghalang potensi isu seperti rasuah data atau keadaan perlumbaan.
Atas ialah kandungan terperinci Cara Menggunakan Mutex dalam Ruby: Panduan Komprehensif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!