كيفية الكشف عن الجمود مثال اسيو المكتبة ؟

StackOverflow https://stackoverflow.com/questions/355958

  •  21-08-2019
  •  | 
  •  

سؤال

لدي مشكلة صغيرة مع دفعة::اسيو المكتبة.بلدي التطبيق تلقي ومعالجة البيانات بشكل غير متزامن ، إنشاء المواضيع و تشغيل io_service.تشغيل() على كل منهم.

boost::asio::io_service io;
boost::thread_group thread_pool;
...
int cpu_cnt = get_cpu_count();
for (int i = 0; i < cpu_cnt; ++i)
{
    thread_pool.create_thread( boost::bind(&run_service, &io) );
}

void run_service(boost::asio::io_service* io)
{
    try
    {
        io->run();//make fun
    }
    catch(const std::exception& e)
    { //process error
    }
    catch(...)
    { //process error
    }
}

مرة بعد مرة, طلبي يتلقى رسالة(عبر مراسلات windows system) من بعض المشرف التطبيق الذي يتحقق هو برنامجي على قيد الحياة أم لا.إذا كان طلبي متعود الرد ، فإنه سيتم إعادة تشغيل.الجزء صعبة هنا هو التحقق من أن المواضيع يتم تشغيل وليس في طريق مسدود.لا أستطيع الرد على معالج io_service مثل هذا:

io.post( &reply_to_supervisor );

ولكن هذا الأسلوب يؤثر على مؤشر واحد فقط.كيف يمكنني التحقق من أن جميع المواضيع تشغيل و لا طريق مسدود?

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

المحلول

قد أكون مخطئا, ولكن هل استخدام io_service في موضوع حل مشكلتك ؟

فكرة أخرى:بعد cpu_cnt مرات reply_to_supervisor المكالمات التي تستخدم قليلا sleep() - ليس لطيفا, ولكن يجب أن تعمل

نصائح أخرى

هذا يبدو لي مثيل وقف المشكلة, ولكن بما أنك تظهر على ويندوز, قد ترغب في النظر في البرمجيات الحل فقط::موضوع المكتبة.وهو تنفيذ مشروع C++0x خيوط المكتبة ، وقد بنيت في الكشف عن حالة توقف تام في mutexes.

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

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

عليك, أنا متأكد من أن هناك طرق أخرى ولكن هذا هو ما تتبادر إلى الذهن الآن...=)

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