"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية استخدام Mutex في روبي: دليل شامل

كيفية استخدام Mutex في روبي: دليل شامل

تم النشر بتاريخ 2024-08-23
تصفح:714

How to Use Mutex in Ruby: A Comprehensive Guide

مقدمة

يعد التزامن أداة قوية في البرمجة، مما يتيح لخيوط متعددة تنفيذ التعليمات البرمجية في وقت واحد. ومع ذلك، مع هذه القوة تأتي مسؤولية إدارة الموارد المشتركة بأمان. في روبي، يعد Mutex (اختصار للاستبعاد المتبادل) عنصرًا رئيسيًا في ضمان أن مؤشر ترابط واحد فقط يمكنه الوصول إلى المورد في المرة الواحدة، مما يمنع تلف البيانات المحتمل أو السلوك غير المتوقع.
في هذه المدونة، سنستكشف كيفية استخدام Mutex في Ruby، مدعومًا بنموذج التعليمات البرمجية وسيناريو واقعي لتوضيح تطبيقه العملي.

ما هو Mutex؟

Mutex هو كائن يستخدم لإدارة مزامنة سلاسل الرسائل. عندما يقوم أحد الخيوط بتأمين Mutex، فإن أي مؤشر ترابط آخر يحاول قفل نفس Mutex سيتم تعليقه حتى يقوم الخيط الأول بتحريره. تضمن هذه الآلية أن الأقسام المهمة من التعليمات البرمجية، حيث يتم الوصول إلى الموارد المشتركة، يتم تنفيذها بواسطة مؤشر ترابط واحد فقط في المرة الواحدة.

لماذا نستخدم Mutex؟

تخيل سيناريو حيث تقوم عدة سلاسل رسائل بتعديل نفس المتغير أو الكتابة إلى نفس الملف. وبدون المزامنة الصحيحة، قد تكون النتيجة غير متوقعة أو غير صحيحة. يساعد Mutex على تجنب مثل هذه المشكلات من خلال التأكد من أن مؤشر ترابط واحد فقط يمكنه الوصول إلى المورد المشترك في أي وقت.

كيفية استخدام Mutex في روبي

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}"

في هذا المثال:

  • نقوم بتهيئة كائن Mutex.
  • نقوم بإنشاء مورد مشترك (عداد) يمكن الوصول إليه من خلال سلاسل رسائل متعددة.
  • نقوم بإنشاء 10 سلاسل، كل منها يزيد العداد 1000 مرة.
  • داخل كتلة mutex.synchronize، نضمن أن مؤشر ترابط واحد فقط يمكنه تعديل العداد في المرة الواحدة.
  • أخيرًا، نقوم بطباعة القيمة النهائية للعداد، والتي يجب أن تكون 10000 إذا قام Mutex بمزامنة الوصول بشكل صحيح.

سيناريو الحياة الواقعية: إدارة معاملات الحساب المصرفي

لفهم التطبيق الواقعي لـ Mutex، دعونا نفكر في سيناريو حيث تمثل سلاسل العمليات المتعددة المعاملات على حساب مصرفي. قد تتضمن كل معاملة إيداع أو سحب أموال، ويجب علينا التأكد من أن رصيد الحساب يظل دقيقًا.

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 



في هذا السيناريو:

  • نحدد فئة الحساب البنكي مع طرق الإيداع والسحب.
  • نقوم بإنشاء مثيل BankAccount مشترك برصيد أولي قدره 1000.
  • نقوم بإنشاء موضوعين: أحدهما لإيداع الأموال والآخر لسحب الأموال.
  • نحن نستخدم Mutex لمزامنة الوصول إلى طرق الإيداع والسحب، مما يضمن أن معاملة واحدة فقط يمكنها تعديل رصيد الحساب في المرة الواحدة.
  • أخيرًا، نقوم بطباعة رصيد الحساب النهائي، والذي يجب أن يعكس بدقة جميع المعاملات.

خاتمة

يعد استخدام Mutex في Ruby أمرًا ضروريًا عند التعامل مع التزامن والموارد المشتركة. فهو يوفر طريقة بسيطة لكنها فعالة للتأكد من أن مؤشر ترابط واحد فقط يمكنه الوصول إلى قسم مهم من التعليمات البرمجية في المرة الواحدة، مما يمنع المشكلات المحتملة مثل تلف البيانات أو حالات السباق.

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/sonianand11/how-to-use-mutex-in-ruby-a-comprehensive-guide-18aa?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3