เหตุใด pthreads ที่ไม่ได้เข้าร่วมจึงทำให้ทรัพยากรรั่วไหลเมื่อเธรดไม่ถูกแยกออกหลังจาก pthread_create

ผมยกตัวอย่างมาจาก

https://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html

ทำให้มันทำงานได้อย่างไม่สิ้นสุด (ด้วยโหมดสลีปเล็กน้อย ดังนั้นการใช้งาน CPU จึงไม่เป็นปัญหาคอขวด ดังนั้นจึงไม่ต้องคอยรอเธรด) โดยการสร้างเธรดด้วย pthread_create โดยไม่เคยเรียก pthread_join นั่นทำให้หน่วยความจำรั่วและในที่สุดพีซีก็หน่วยความจำไม่เพียงพอ เมื่อฉันเพิ่ม pthread_detach ทันทีหลังจากสร้างโปรแกรมเธรดทำงานได้ดีและการใช้หน่วยความจำจะคงที่หลังจากผ่านไประยะหนึ่ง

ฉันรู้สึกว่าเมื่อเธรดออก (เมื่อปิด } ของฟังก์ชันที่หากกำหนดให้กับ pthread_create) ทรัพยากรทั้งหมดจะถูกล้าง


person NoSenseEtAl    schedule 13.12.2012    source แหล่งที่มา


คำตอบ (1)


ฉันรู้สึกว่าเมื่อเธรดออก (ที่ปิด } ของฟังก์ชันที่หากกำหนดให้กับ pthread_create) ทรัพยากรทั้งหมดจะถูกล้าง

นั่นเป็นความรู้สึกที่ผิด อย่างที่คุณพูด ทรัพยากรทั้งหมดจะถูกปล่อยออกมาสำหรับเธรดที่เสร็จสิ้นเมื่อคุณเรียก pthread_join หรือเธรดนั้นเป็นเธรดที่แยกออก

สำหรับเธรดที่ไม่ได้แยกออก ทรัพยากรบางอย่างจะต้องถูกเก็บไว้ ไม่เช่นนั้นคุณจะไม่สามารถรับค่าส่งคืนของเธรดได้ด้วยการเรียก pthread_join ในภายหลัง ไม่สามารถเข้าร่วมเธรดที่แยกออกได้ ดังนั้นคุณจึงไม่สามารถรับค่าออกได้

การใช้งานจำนวนมากเก็บค่าที่ส่งคืนนี้ไว้ในสแต็กของเธรด และด้วยเหตุนี้จึงเก็บสแต็กทั้งหมดไว้จนกว่าจะมีคนเรียก pthread_join บนเธรดที่ไม่ได้แยกออก

person nos    schedule 13.12.2012