سؤال

ماذا يحدث إذا كان لدي مقبس واحد، s, ، لا توجد بيانات متاحة عليه حاليًا، فهو عبارة عن مقبس حظر، وأنا أتصل به recv عليه من موضوعين في وقت واحد؟هل سيحصل أحد المواضيع على البيانات؟هل سيحصل عليه كلاهما؟هل سيتم الاتصال الثاني بـ recv العودة مع وجود خطأ؟

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

المحلول

واحد موضوع سوف تحصل عليه، وليس هناك طريقة لمعرفة أي.

وهذا لا يبدو وكأنه تصميم معقول. هل هناك سبب لماذا تحتاج اثنين المواضيع يدعو recv() على نفس المقبس؟

نصائح أخرى

يجب أن تكون

وتطبيقات المقبس الخيط آمنة، وذلك بالضبط موضوع واحد يجب الحصول على البيانات عندما تصبح متوفرة. دعوة أخرى يجب أن تمنع فقط.

لا أستطيع العثور على مرجع لهذا، ولكن هنا ما أفهمه:

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

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

على العكس من ذلك، لنفترض أن الخيط A يصنع a حظر قم باستدعاء الدالة recv()‎ على مقبس TCP، وستدخل البيانات ببطء.ومن ثم يعود استدعاء الدالة recv()‎ مع ضبط الدالة errno على EAGAIN.

في أي من هذه الحالات، افترض أن مؤشر الترابط B يستدعي recv() على نفس المقبس بينما لا يزال مؤشر الترابط A يتلقى البيانات.متى يتوقف الخيط "أ" عن تسليم البيانات إليه حتى يتمكن الخيط "ب" من البدء في تلقي البيانات؟لا أعرف أي تطبيق Unix سيحاول أن يتذكر أن الخيط A كان في منتصف عملية على المقبس؛بدلاً من ذلك، الأمر متروك للتطبيق (الخيطان A وB) للتفاوض بشأن استخدامه.

بشكل عام، من الأفضل تصميم التطبيق بحيث يقوم واحد فقط من الخيوط باستدعاء recv() على مقبس واحد.

على ريكف

<اقتباس فقرة>   

وA ريكف () على مأخذ توصيل SOCK_STREAM   يعود أكبر قدر من المعلومات المتاحة   ويبلغ حجم المخزن المؤقت الموردة يمكن   عقد.

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

والموضوع ويقرر أنه ليس لديه رسالة كاملة، لذلك يدعو ريكف () مرة أخرى. ولكن في هذه الأثناء B تم حجب بالفعل على نفس المقبس، وتلقت ما تبقى من "الرسالة" التي كانت مخصصة لموضوع A. أنا باستخدام المقصود هنا فضفاضة.

والآن كل من موضوع A و B موضوع يكون له رسالة غير مكتملة، وسوف، وهذا يتوقف على كيفية كتابة التعليمات البرمجية، ورمي البيانات بعيدا أنها غير صالحة، أو تتسبب في حدوث أخطاء غريبة وخفية.

وأتمنى أن أقول إنني لم أكن أعرف هذا من تجربة.

وذلك في حين ريكف () نفسها الخيط من الناحية الفنية آمنة، بل هو فكرة سيئة لاثنين من المواضيع تطلق في وقت واحد إذا كنت تستخدم لTCP.

وكما بقدر أعرف أنها آمنة تماما عند استخدام UDP.

وآمل أن يساعد هذا.

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