سؤال

أنا البرمجة وهو interprocess وحدة (عملية و عملية ب).

هل هناك أي طريقة التواصل الخيط في ب يمكن تشغيل (يكون فتح) في أقرب وقت عملية التشطيبات إجراءات محددة ، أعني دون ب القيام بأي الاقتراع ولا ب الانتظار كثيرا بعد انتهاء العمل ؟

والتي هي مفاهيم/نماذج/أنماط التصميم التي تحكم هذه القضايا ؟ (شيء أكثر دقة من التزامن بين العمليات).المكتبات/أساليب هل تنصح ؟

شكرا

تحرير:أنا أبحث عن طرق مناسبة لكل من الثلاثة الرئيسية انظمة التشغيل:مايكروسوفت ويندوز وأبل ماك OS X ، غنو/لينكس.

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

المحلول

هذا من الصعب جدا العمل:

Unix انظمة التشغيل التي يمكنك استخدامها:

  • pthread حالة مزامنة مع setpshared الحجة.

    ملاحظة:كانت مدعومة جيدا تحت لينكس 2.6, سولاريس, لكنه لا يؤيد فري Cygwin (لا أعرف عن نظام التشغيل Mac OS X)

  • بالنسبة Unixes يمكنك أيضا استخدام اسمه الإشارات, ولكن أنا لا أعرف مستوى الدعم لهم

  • ويندوز هناك بعض الأحداث...

هذا هو مهمة صعبة ، وخاصة بالنسبة IPC...

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

ولكن تأكد أن كل ميزة معتمدة على جميع انظمة التشغيل التي تريد الدعم.

أشياء يجب ملاحظة حول دفعة.بين العمليات

التحقق بعناية من مستوى الدعم لكل Unix OS كنت بحاجة إلى العمل مع ، لأن زيادة.Interprosess يستخدم pthread_* الوظائف التي لا تدعم دائما...ثم فشل مرة أخرى إلى مضاهاة-التحقق من جودة هذه مضاهاة

أيضا, كيف تحقق هذه الأشياء تعمل على ويندوز -- بقدر ما أنا أعلم أنه لا يوجد "في الذاكرة المشتركة" mutexes في Win32 API, عموما اسمه الأشياء التي يجب استخدامها ، حتى تحقق ما هو معتمد وكيف.

نصائح أخرى

تحرير: اعتقدت خطأ كنت في حاجة بين الخيط مزامنة المنقحة للتصنيف الدولي للبراءات

أعتقد أنك بحاجة إلى شيء مثل waitable الأحداث.

في ويندوز يمكنك استخدام CreateEvent(), إلى إنشاء (أو القائمة) اسمه, لصناعة السيارات في إعادة تعيين الحدث.

عند عملية اكتمال المعالجة ، SetEvent(), بينما العملية ب يجب استدعاء WaitForSingleObject() إلى النوم حتى الانتهاء (أو مهلة).

يمكنك بدلا من ذلك استخدام الإشارات التي تم إنشاؤها من قبل CreateSemaphore(), تهيئة إلى 0.معالجة الإشارات استكمال طريق الاتصال ReleaseSemaphore(), بينما العملية ب مرة أخرى يستخدم WaitForSingleObject() أن تنتظر الإنجاز.

تحت لينكس و OS X يمكنك استخدام الإشارات إلى تأثير مماثل.استخدام sem_open() لإنشاء اسمه إشارة ، مع 0 حيث القيمة الأولية.

عند عملية يكمل ، sem_post() إلى زيادة إشارة ، في حين أن عملية ب يجب استدعاء sem_wait() إلى النوم حتى الانتهاء.

ملاحظة:في إشارة الطريقة قد تسمح متعددة الاكمال أن تكون الإشارة ، يجب التعامل مع هذا عن طريق وضع حد أقصى للعدد تحت ويندوز ، أو التحقق الحالي sem قيمة العقل مع sem_getvalue()


أعتقد أن حالة المتغيرات تناسب ما كنت تحاول القيام به ، وهنا عينة من شأنها أن تعمل على لينكس و ماك

#include <pthread.h>
/* no error checking, quick and dirty sample */
pthread_mutex_t g_mutex;
pthread_cond_t g_cond;
int a_done = 0;

void init(void)
{
    pthread_mutex_init(&g_mutex, NULL);
    pthread_cond_init(&g_cond, NULL);
}

void thread_a(void *arg)
{
    /* do something here... */
    pthread_mutex_lock(&g_mutex);
    a_done = 1;
    pthread_cond_signal(&g_cond);
    pthread_mutex_unlock(&g_mutex);
}

void thread_b(void *arg)
{
    /* wait for a to complete */
    pthread_mutex_lock(&g_mutex);
    while (!a_done)
        pthread_cond_wait(&g_cond, &g_mutex);
    a_done = 0;
    pthread_mutex_unlock(&g_mutex);
}

تحت ويندوز, يمكنك استخدام pthreads-win32, أو الأم حالة المتغيرات تحت ويندوز فيستا ، انظر MSDN حالة المتغيرات الصفحة لمزيد من المعلومات.

المراجع:

إذا OS يدعم إشارات يمكن فتح كائن مزامنة من معالج إشارة وإرسال إشارة من عملية وبمجرد الانتهاء من هذه المهمة.

سوف

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

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

وثمة نهج آخر هو جعل الاقتراع في موضوع منفصل.

إذا كنت تريد الذهاب لتطوير تطبيق كبير انه يستحق أن ننظر نحو ACE إطار أو تعزيز . هذه الأطر هي الحلول عبر منصة، مصممة بشكل جيد واختبارها بشكل جيد.

حسنا، في رأيي، والخبرة، وأفضل طريقة للقيام بذلك بطريقة المحمولة وبسيطة لاستخدام مآخذ. بالإضافة إلى حصولك على إمكانية أن يكون العمليتين على آلة مختلفة (إذا لزم الأمر). بالإضافة إلى أن تتمكن extand البلاغ إلى التعامل مع أكثر من التزامن.

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

ليكون استخدام المحمول مكتبة مأخذ المحمولة مثل rel="nofollow تعزيز أو <وأ href = "HTTP: // www.melikyan.com/ptypes/ "يختلط =" نوفولو noreferrer "> ptypes أو أيا كان.

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