سؤال

فريقي يناقش حاليا هذه المسألة.

الرمز المعني هو شيء على غرار

if (!myDictionary.ContainsKey(key))
{
    lock (_SyncObject)
    {
        if (!myDictionary.ContainsKey(key))
        {
            myDictionary.Add(key,value);
        }
    }
}

بعض المشاركات التي رأيتها تقول أن هذا قد يكون كبيرا لا لا (عند استخدام تريجيتفالو).ومع ذلك ، يقول أعضاء فريقنا إنه على ما يرام لأن "يحتوي على مفتاح" لا يتكرر في مجموعة المفاتيح ولكنه يتحقق مما إذا كان المفتاح موجودا عبر رمز التجزئة في س(1).ومن ثم يزعمون أنه لا يوجد خطر هنا.

أود الحصول على آرائكم الصادقة بشأن هذه المسألة.

هل كانت مفيدة؟

المحلول

لا تفعل هذا.انها ليست آمنة.

هل يمكن أن يكون الدعوة ContainsKey من مؤشر ترابط واحد بينما يدعو مؤشر ترابط آخر Add.هذا ببساطة غير مدعوم من قبل Dictionary<TKey, TValue>.إذا Add يحتاج إلى إعادة تخصيص الدلاء وما إلى ذلك ، يمكنني أن أتخيلك يمكن الحصول على بعض النتائج غريبة جدا ، أو استثناء.ذلك أيار / مايو لقد كتبت بطريقة لا ترى فيها أي تأثيرات سيئة ، لكنني لا أرغب في الاعتماد عليها.

إنه شيء واحد يستخدم قفلا تم التحقق منه مرتين للقراءة / الكتابة البسيطة إلى حقل، على الرغم من أنني ما زلت أجادل ضده-إنه شيء آخر لإجراء مكالمات إلى واجهة برمجة التطبيقات التي تم وصفها صراحة على أنها لا كونها آمنة للمكالمات المتزامنة متعددة.

إذا كنت على. صافي 4, ConcurrentDictionary ربما هو الطريق إلى الأمام.خلاف ذلك ، فقط قفل على كل وصول.

نصائح أخرى

إذا كنت في بيئة متعددة مؤشرات الترابط، فقد تفضل النظر في استخدام AccountRentDictionary.لقد قمت بلوغها منذ بضعة أشهر، قد تجد المقالة مفيدة: http://colinmackay.co.uk/blog/2011/2012/03/24/Parallelisation-in-Net-4-0-The>

هذا الرمز غير صحيح.ال Dictionary<TKey, TValue> النوع لا يدعم عمليات القراءة والكتابة المتزامنة.على الرغم من أن لديك Add تسمى الطريقة داخل القفل ContainsKey ليس كذلك.وبالتالي فإنه يسمح بسهولة لانتهاك قاعدة القراءة / الكتابة في وقت واحد ، وسوف يؤدي إلى الفساد في المثال الخاص بك

لا يبدو آمنا للخيط، ولكن من المحتمل أن يكون من الصعب جعله يفشل.

لا تحتوي حجة البحث في بحث تجزئة مقابل، قد يكون هناك تصادم تجزئة على سبيل المثال.

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

على سبيل المثال، هذا إصدار قطع من الأسلوب الذي نستخدمه الذي نستخدمه يحاول الحصول على كائن مخطط مرتبط بنوع، وإذا كان لا يمكن ذلك، فإنه يذهب إلى الأمام ويخلق كائنات مخطط لجميع الأنواع التي يجدها جميع الأنواع في نفس التجميع كنوع محدد لتقليل عدد المرات التي يجب فيها نسخ القاموس بأكملها: giveacodicetagpre.

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

يمكنك تطبيق مبادئ مماثلة في مواقف أخرى أيضا.

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