سؤال

هل مؤشر الترابط fprintf آمن؟ دليل glibc يبدو أنه كذلك، لكن تطبيقي، الذي يكتب إلى ملف باستخدام استدعاء واحد لـ fprintf() يبدو أنه يخلط بين عمليات الكتابة الجزئية من عمليات مختلفة.

يحرر:للتوضيح، البرنامج المعني هو com.lighttpd البرنامج المساعد، والخادم يعمل مع مؤشرات ترابط عاملة متعددة.

وبالنظر إلى الملف، تختلط بعض الكتابات.

تحرير 2:يبدو أن المشكلة التي أراها قد ترجع إلى أن "سلاسل العمل" الخاصة بـ lighttpd هي في الواقع عمليات منفصلة: http://redmine.lighttpd.net/wiki/lighttpd/Docs:MultiProcessor

مشاكل

من خلال تشغيل عمليتين أو أكثر على نفس المقبس ، سيكون لديك توافق أفضل ، ولكن سيكون لديك بعض العيوب التي يجب أن تكون على دراية بها:

  • قد يقوم mod_accesslog بإنشاء سجلات وصول معطلة، حيث يتم فتح نفس الملف مرتين ولا تتم مزامنته.
  • سيكون mod_status ن عدادات منفصلة ، مجموعة واحدة لكل عملية.
  • ستفشل mod_rrdtool لأنها تتلقى نفس الطابع الزمني مرتين.
  • لن يُظهر mod_uploadprogress الحالة الصحيحة.
هل كانت مفيدة؟

المحلول

أنت تخلط بين مفهومين - الكتابة من سلاسل رسائل متعددة والكتابة من عمليات متعددة.

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

نصائح أخرى

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

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

لا يذكر معيار C++ الحالي أي شيء مفيد بشأن التزامن، ولا يفعل ذلك معيار 1990 C.(لم أقرأ معيار 1999 C، لذا لا يمكنني التعليق عليه؛معيار C++0x القادم يقول أشياءً، لكنني لا أعرف بالضبط ما هو مرتجل.)

هذا يعني أن fprintf() نفسها من المحتمل ألا تكون آمنة لمؤشر الترابط ولا غير ذلك، وأنها ستعتمد على التنفيذ.لقد قرأت بالضبط ما تقوله وثائق glibc حول هذا الموضوع، وقارنته بما تفعله بالضبط.

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