سؤال

في تطبيق My Multittraded، أستخدم وظيفة النوم () (واحد من مكتبة GRFW):

glfwSleep(..);

ويبدو أنه يؤدي طلبي إلى Segfaulting كما تظهر مكدس مكالماتي:

#0 76CFC2BC WaitForSingleObjectEx() (C:\Windows\system32\kernel32.dll:??)
#1 00000016 ??() (??:??)
#2 0000006C ??() (??:??)
#3 00000000 ??() (??:??)

ال glfwSleep() يستخدم داخل مؤشر ترابط. هل هذا خطير؟ لماذا هو برنامجي Segfaulting نتيجة لذلك؟

يحرر:

عندما معلمة glfwSleep() هو <0.02 (SECS) لا segfault!

تحرير 2:

من الوثائق الرسمية للزغرو:

قد يكون كتابة التطبيقات الخيوط محرجا للغاية قبل أن تعتاد عليه، ولكن هناك بعض القواعد الرئيسية البسيطة إلى حد ما لمتابعة:

  • قم دائما بضمان الوصول الحصري إلى البيانات التي يتم مشاركتها بين المواضيع!
  • تأكد من أن المواضيع متزامنة بشكل صحيح!
  • أبدا مشغول الانتظار!

أعتقد أنني حصلت على إجابتي .. هل في العثور على بديل الآن ..

شكرا!

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

المحلول

من ويكي glfw:

Glfw لا يعمل بشكل جيد مع مؤشرات الترابط GHC أو Forkio أو ThreadDelay. لذلك تجنبها إذا استطعت.

نصائح أخرى

هو segfault'ed الموضوع نفس الخيط من المتصل من glfwsleep ()؟

يبدو أن الانهيار الناجم عن نداء waitformultipleobjectsex api. هل تحدد وتمرير كائنات المزامنة الصحيحة والأرقام الصحيحة إلى WaitFormultipleObjectSex؟

يقتبس مبرمج براغماتي,

`اختيار '' غير مكسور

من النادر العثور على خطأ في نظام التشغيل أو التحويل البرمجي، أو حتى منتج أو مكتبة جهة خارجية. الخطأ على الأرجح في التطبيق.

لماذا يدعو برنامجك WaitForSingleObjectEx() متي glfwSleep() المكالمات Sleep()ب حسنا، على الرغم من عدم وجود شفرة المصدر Sleep(), انها ليست مربع أسود تماما. تفكيك Sleep() وربما ترى (اعتمادا على إصدار Windows لديك) ذلك Sleep() إما المكالمات أو مكالمات الذيل SleepEx(). وبعد على XP، SleepEx() المكالمات NtDelayExecutionThread(), وعلى نظام التشغيل Vista يدعو WaitForSingleObjectEx().

إذن ماذا حدث لبقية مكدسك؟ 00000016، 0000006C، و 00000000 ليست عناوين عودة صالحة. لن أفاجأ إذا كان في مكان ما في التعليمات البرمجية الخاصة بك، يمكنك تمرير مؤشر إلى مخزن مؤقت مخصص للمكدس إلى مؤشر ترابط آخر، وبينما ينام برنامجك، أن مؤشر ترابط آخر يفسد مكدس الخيط الأول. خطوة الى Sleep(), ، ضع نقطة توقف ذاكرة عن عنوان المرسل، وقد تكون قادرا على التقاط الجاني.

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