لماذا تفشل PTHREAD_CREATE () مع 2 مؤشرات ترابط نشطة فقط؟

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

  •  05-07-2019
  •  | 
  •  

سؤال

أواجه بعض المتاعب في أول غزو في مؤشرات الترابط في C. أحاول (في الوقت الحالي) كتابة برنامج خادم بسيط للغاية يقبل اتصال المقبس ويبدأ مؤشر ترابط جديد لمعالجته. يبدو أنه يعمل بشكل جيد باستثناء أنه لن ينشئ سوى حوالي 300 موضوع (303 ، أحيانًا 304) قبل فشل PTHREAD_CREATE () مع رمز EAGAIN ، مما يعني:

"كان النظام يفتقر إلى الموارد اللازمة لإنشاء مؤشر ترابط آخر ، أو سيتم تجاوز الحد الذي فرضه النظام على العدد الإجمالي للموضوعات في عملية {pthread_threads_max}."

هذا هو ليس 303 مؤشرات ترابط في نفس الوقت - كل مؤشر ترابط يتم تأكيده بواسطة GDB. في كل مرة تسمى وظيفة طلب العملية ، هناك موضوعان يعملان.

لذلك يعني "النظام يفتقر إلى الموارد اللازمة". سؤالي هو (وقد يكون غبيًا بعض الشيء) - ما هي هذه الموارد؟ من المفترض أنه تسرب ذاكرة في برنامجي (بالتأكيد ممكن ، على الأرجح) ، لكنني اعتقدت أنه حتى يتمكن من إدارة أكثر من 300 بالنظر إلى أن بقية البرنامج لا يفعل سوى القليل.

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

شكرًا

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

المحلول

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

نصائح أخرى

ربما قليلا مبالغة (؟) ولكن فالغريند يمكن أن تساعدك على تحديد موقع Memleaks في Linux.

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

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