سؤال

انا استخدم واجهة طبقة الراديو (RIL) واجهات برمجة التطبيقات الأصلية في تطبيق Windows Mobile. في واجهة برمجة التطبيقات هذه ، لا يتم إرجاع قيم / نتائج الإرجاع لمعظم الوظائف على الفور ولكن يتم تمريرها من خلال وظيفة رد الاتصال التي يتم تمريرها إلى API RIL.

تم العثور على بعض أمثلة الاستخدام في أدوات XDA Develompent و جوجل التروس تحديد الموقع الجغرافي API.

سؤالي هو ، في هذين المثالين ، يتم استخدام mutex لحراسة البيانات بدلاً من كائنات التزامن الأخرى.

الآن ، هل سيكون القسم الحرج جيدًا هنا في حالات الاستخدام الموصوفة من قبل كلا المثالين؟ ما هو الموضوع أو العملية التي ستتصل بها بالفعل وظائف رد الاتصال؟

تعديل:
يتم الوصول إلى بياناتي من خلال رموز بلدي فقط من داخل عمليتي ولكن أي مؤشر ترابط/العملية تستدعي وظائف رد الاتصال في RIL API؟ أعني ، لقد نقلت رد اتصال الوظيفة إلى API RIL ، ولكن هل تسمى عمليات الاسترجاعات من عملية أخرى؟ في هذه الحالة ، سوف يقدم تفسيراً آخر لماذا تستخدم العينات Mutex. إذا قام API RIL بإنشاء موضوع داخل عملي ودعا وظائف الاتصال الخاصة بي ، فأعتقد أن القسم الحرج سيكون على ما يرام (وهو أسرع من Mutex).

تحديث:
لدي بيانات (1) تم الوصول إليها بواسطة رموز بلدي من داخل عملي الخاص وأيضًا (2) تم تعديله من رد الاتصال بالوظيفة. يتم رد الاتصال بواسطة RIL API.

سؤالي: ما هو موضوع/عملية الاتصال بوظائف رد الاتصال في RIL API؟

القصة حتى الآن:
أنا: مرحبًا السيد ريل ، يرجى وضع بعض البيانات في مكتبي (المعروف أيضًا باسم متغيرات).
ريل: حسنا سيدي. سأضع البيانات لاحقًا وسأشير إليك عند الانتهاء (استخدمت حدثًا هنا).

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

إذا كان السيد RIL يستخدم بطاقة الوصول الخاصة به ، فهذا يعني أنني لست بحاجة إلى إعداد بطاقة الوصول/الزائر له وهذا يعني مشكلة أقل بالنسبة لي. (أي القسم الحرج أسرع من mutex)

المشكلة هي أنني قابلت هذا السيد ريل قبل بضعة أيام ولا أعرف الكثير عنه. لا أعرف ما إذا كان من نفس الشركة مثلي. خيار واحد المشار بواسطة نوبوجز هو إعداد بطاقة وصول للسيد RIL بغض النظر عما إذا كان MR RIL من نفس الشركة مثلي. وبهذه الطريقة ، يضمن السيد Ril أن يكون قادرًا على دخول مكتبي. (البيانات/المتغيرات الخاصة بي مضمونة لتكون آمنة)

الآن أستخدم Mutex في الكود الخاص بي (قم بإعداد بطاقة وصول ربما زائدة عن الحاجة للسيد RIL).

آها! فقط حصلت على فكرة عند كتابة هذا. أعتقد أنني سأسأل السيد ريل فقط من أي شركة هو. وبهذه الطريقة ، لا يتعين علي إعداد بطاقة وصول له في المستقبل إذا تبين أنه في نفس الشركة مثلي. (أي وضع GetCurrentProcessId() و GetCurrentThreadId() في وظيفة رد الاتصال)

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

المحلول

عادةً ما يتواجد Windows Mobile RIL في الجهاز. ومع ذلك ، عندما تستدعي عمليتك RIL ، تمر مكالمتك عبر وكيل RIL.

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

هذا يعني أن الكود الخاص بك يمكنه استخدام كائن Critice_Section لتوفير المزامنة/الحماية اللازمة.

نصائح أخرى

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

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

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

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

تحديث: ما لم يفعلوا شيئًا غير عادي حقًا في RIL ، فإن رد الاتصال سيحدث خلال عمليتك ، لذلك يجب أن يكون الحرج كافيًا. إذا قامت بتعديل بياناتك ، فهذا يعني أن بياناتك يتم تعيينها ومرئية لتلك الرمز - مما يعني أن البيانات الموجودة في البيانات الواردة في القسم الحرج سيتم أيضًا تعيينها ومرئيًا ، وسوف تعمل. الوقت الذي لا يعمل فيه القسم الحرج هو عندما تتعامل مع عمليات منفصلة ، وبالتالي فإن البيانات الواردة في واحدة لا يتم تعيينها/مرئي للآخر.

حسنًا ، هناك اختلاف آخر بين Mutex والقسم الحرج (تطبيقات Windows ، بالطبع) هو أن القسم الحاسم يتم إعادة إدخاله - أي يمكن للمعلومات نفسها الحصول على القسم الحرج مرتين دون الحاجة إلى إطلاقه.

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