سؤال

وهنا الشيء: لقد اثنين من التطبيقات، وكتب في C ++ والتي تعمل على جهازين مع نظام التشغيل المختلفة (واحد لينكس واحد ويندوز). واحدة من هذه العملية هو المسؤول عن تحديث ملف XML على NAS (شبكة التخزين المرفقة) في حين أن الآخر يقرأ هذا الملف.

هل من الممكن مزامنة هاتين العمليتين من أجل تجنب القراءة من ملف في نفس الوقت انه يجري تعديلها؟

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

المحلول

هل يمكن إنشاء ملف تأمين على الخادم الذي تم إنشاؤه قبل أن تفعل الكتابة، وانتظر ثم كتابة وحذف على الانتهاء، أن يكون لديه الاختيار عملية قراءة للرمز قبل قراءة الملف.

تعديل : في ولمعالجة التعليقات، يمكنك تنفيذ نوع قفل نمط التحقق المزدوج. يكون كل من القارئ والكاتب يكون ملف تأمين وتأكد قبل أن تفعل العمل، شيئا مثل:

وقارئ: التحقق من وجود ملف تأمين كتابة، إنشاء قراءة ملف قفل، وتحقق من وجود ملف تأمين كتابة، في حالة وجود حذف ملف للقراءة وإجهاض

الكاتب: التحقق من وجود ملف تأمين قراءة، إنشاء ملف تأمين كتابة، لفحص ملف تأمين قراءة، في حالة وجود حذف ملف تأمين كتابة وإجهاض

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

نصائح أخرى

وشكرا لكم جميعا على إجاباتك.

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

وOK كنت بحاجة الى بعض شكل قفل آلية للسيطرة على الوصول.

تقدم

ومعظم أنظمة * لا شىء الملف هذا. وأظن أنها لا تتوفر على نظام ملفات Windows أيضا (كما يتم استخدام هذه الآلية التي بيرل) ولكنه قد يكون اسم آخر.

ونلقي نظرة على قطيع ().
هذا هو آلية قفل ملف. وهو قفل استشاري لذلك لا قفل في الواقع ملف ومنع استخدام ولكنه يوفر آلية لوسم الملف. إذا تستخدم في التطبيقات الآلية ثم يمكنك التحكم في المداخل إلى الملف.

والغنم () توفر كلا من تأمين المشتركة (أو READ قفل) والحصرية أقفال (أو الكتابة قفل). سوف القطيع منع الخيط الخاص بك (بطريقة غير مشغول) حتى تم إلغاء الملف من قبل المستخدم (كما يوفر الشيكات حجب NON حتى تتمكن من القيام بأشياء أخرى أثناء انتظار).

تحقق من القطيع في المادة 2 من رجل صفحات.

int     flock(int fd, int operation);

Flock() applies or removes an advisory lock on the file associated with the file
descriptor fd.  A lock is applied by specifying an operation parameter that is
one of LOCK_SH or LOCK_EX with the optional addition of LOCK_NB.  To unlock an
existing lock operation should be LOCK_UN.

إذا تتواجد الملفات على NFS مشاركة يمكنك استخدام fcntl (2) لقفل الملف. تحقق السؤال <م> D10 في لينكس NFS التعليمات . لدي خبرة قليلة جدا مع نوافذ واجهات برمجة التطبيقات ولكن من ما سمعت لديهم دعم POSIX جيد لذلك يجب عليك أن تكون قادرا على استخدام fcntl طالما أنها تدعم POSIX.1-2001.

إذا تم الوصول إلى الملفات باستخدام بروتوكولات مختلفة (أي AFS أو SMB) ربما يمكن إعداد ملقم تزامن بسيط هو أن يدير أقفال عبر واجهة IPC؟

وسيكون من الممكن للتبديل من الملفات إلى قاعدة البيانات؟

وهذا النوع من concurency شيء في DBMSs إدارة بشكل جيد للغاية. انها لا تحتاج الى أن تكون مكلفة أو صعبة لتثبيت. سوف الخلية، Postgress أو JavaDB عن التعامل مع هذا رائع بتكلفة قليلة أو معدومة.

وإذا تعذر خيار قاعدة البيانات وأود أن الكتابة عملية الكتابة إلى اسم الملف "مخفي" مثل ".updateinprogress.xml" وإعادة تسمية الملف عند اكتمال التحديث. على معظم أنظمة "ام" أو "رن" هو عملية الذرية وبالتالي فإن عملية القراءة إما تلتقط إيرباص الملف القديم أو بملف جديد لكن لم يحصلوا على نصف كتبت واحدة.

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