هل هذا هو الاستخدام الصحيح لكائن المزامنة (mutex)؟

StackOverflow https://stackoverflow.com/questions/46909

  •  09-06-2019
  •  | 
  •  

سؤال

لدي موقف حيث قد يكون لدي مثيلات متعددة لبرنامج يعمل في وقت واحد، ومن المهم ألا يتم تنفيذ وظيفة محددة واحدة فقط في أكثر من واحدة من هذه المثيلات في وقت واحد.

هل هذه هي الطريقة الصحيحة لاستخدام كائن المزامنة (mutex) لمنع حدوث ذلك؟

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}
هل كانت مفيدة؟

المحلول

لقد قلت مثيلات متعددة لتطبيق واحد، لذلك نحن نتحدث عن تشغيل برنامجين، أليس كذلك؟لن يتم تأمين بيان القفل عبر برامج متعددة، فقط داخل البرنامج.إذا كنت تريد Mutex حقيقيًا، فانظر إلى System.Threading.Mutex هدف.

فيما يلي مثال للاستخدام:

bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
    try
    {
        mtx.WaitOne();

        MessageBox.Show("Click OK to release the mutex.");
    }
    finally
    {
        mtx.ReleaseMutex();
    }
}

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

نصائح أخرى

الباحث صحيح.

نصيحة جيف ريختر في كلر عبر C# (ص638-9) عند القفل هو إنشاء كائن خاص خصيصًا لغرض القفل.

private Object _lock = new Object();

// usage
lock( _lock )
{
    // thread-safe code here..
}

يعمل هذا لأنه لا يمكن قفل _lock بواسطة أي شيء خارج الفئة الحالية.

يحرر:ينطبق هذا على سلاسل العمليات التي يتم تنفيذها ضمن عملية واحدة.@ إجابة David Mohundro صحيحة بالنسبة للقفل بين العمليات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top