จำนวนเธรดสูงสุด

ฉันมีโปรแกรมที่ยอมรับตัวเลข 2 N หลัก คูณโดยใช้เธรดและพิมพ์ผลลัพธ์

จำนวนเธรดที่สร้างขึ้นที่นี่คือ 2 * N - 1

เมื่อใดก็ตามที่ฉันรันโปรแกรมสำหรับ N > 151 โปรแกรมจะแจ้งข้อผิดพลาดในการแบ่งส่วนให้ฉัน

มีการจำกัดจำนวนเธรดสูงสุดที่กระบวนการสามารถรับได้จากเธรดพูลหรือไม่

หากเป็นเช่นนั้น นี่อาจเป็นเหตุผลที่ถูกต้องสำหรับความผิดดังกล่าวหรือไม่

แก้ไข:

Valgrind พบว่าไม่มีหน่วยความจำรั่วสำหรับ N <= 150

ฉันกำลังรันโปรแกรมในเคอร์เนล Linux 2.6.x


person Community    schedule 02.10.2010    source แหล่งที่มา


คำตอบ (6)


ตามค่าเริ่มต้น แต่ละเธรดจะได้รับสแต็กขนาด 8MB 300 เธรดขนาด 8MB คือ 2.4GB สำหรับสแต็กเธรดเท่านั้น หากคุณใช้งานในโหมด 32 บิต นั่นอาจเป็นพื้นที่ที่อยู่กระบวนการส่วนใหญ่ที่คุณอนุญาต

คุณสามารถใช้ pthread_attr_setstacksize() เพื่อลดขนาดของสแต็กเธรดของคุณให้เหมาะสมขึ้นอีกเล็กน้อยก่อนที่คุณจะสร้าง:

int pthread_attr_setstacksize (pthread_attr_t *__attr, size_t __stacksize)

(สร้าง pthread_attr ใหม่ ตั้งค่าขนาดสแต็กแล้วส่งต่อไปที่ pthread_create)

person caf    schedule 02.10.2010
comment
ตอนนี้ฉันตรวจสอบแล้ว pthread_create จะไม่อนุญาตให้สร้าง pthread 303 แม้ว่าฉันจะรีเซ็ตขนาดสแต็กเป็น 80 ไบต์ก็ตาม - person ; 02.10.2010
comment
มีการจำกัดขนาดทรัพยากรอื่นๆ ที่ต้องลดลงด้วยหรือไม่ - person ; 02.10.2010
comment
@crypto: หากคุณพยายามลดขนาดสแต็กด้านล่าง PTHREAD_STACK_MIN (16384 บน Linux) pthread_attr_setstacksize() จะล้มเหลวและจะใช้ขนาดเดิมต่อไป ลองตั้งค่าให้เป็นค่าที่เหมาะสม (เช่น 65536) - person caf; 02.10.2010
comment
@crypto: คุณควรตรวจสอบค่าที่ส่งคืนของฟังก์ชันที่คุณเรียกใช้เสมอ รวมถึง pthread_create() และ pthread_attr_setstacksize() มันจะช่วยคุณประหยัดเวลาในระยะยาว - person ninjalj; 02.10.2010

POSIX รับประกัน 64 เธรด ยิ่งไปกว่านั้นคือของขวัญจากการนำไปปฏิบัติ

person David Schwartz    schedule 15.08.2011

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

ฉันสงสัยว่ามันจะเป็นจำนวนเธรดสูงสุด โดยพิจารณาว่าเป็นหน้าที่ของ CPU ในการจัดการเธรดเหล่านั้น ฉันจะไม่ใช้เกิน 100 เธรด มันเป็นความคิดที่แย่มาก

person Alexander Rafferty    schedule 02.10.2010

หากใช้ Linux: ให้ทำเครื่องหมาย PTHREAD_THREADS_MAX ใน limits.h นั่นคือค่าสูงสุด จำนวนเธรดที่อนุญาตต่อกระบวนการ และอีกอย่าง: นี่ไม่ควรเป็นสาเหตุของข้อผิดพลาดแบบ Seg

person Mario The Spoon    schedule 02.10.2010

คำถามของคุณไม่ได้ระบุสภาพแวดล้อมการทำงานซึ่งจำเป็นเพื่อให้สามารถตอบคำถามแรกของคุณได้ แต่ถ้าคุณใช้ CPU และจำนวนเธรดที่คุณมีเกินจำนวนแกนประมวลผล (2 หรือ 4 ในโน้ตบุ๊กส่วนใหญ่ ) แสดงว่าคุณอาจสูญเสียทรัพยากรไปโดยเปล่าประโยชน์

สำหรับคำถามที่สอง ไม่ใช่ ไม่ใช่เหตุผลที่ถูกต้องสำหรับข้อผิดพลาดในการแบ่งส่วน สมมติว่าคุณกำลังสร้างเธรดจำนวนไร้สาระนี้ด้วยเหตุผลที่ดีบางอย่างที่เราไม่ทราบ ให้ตรวจสอบการใช้งานเซมาฟอร์และผลลัพธ์การจัดสรรทรัพยากรของคุณอีกครั้ง

person danorton    schedule 02.10.2010

กล่อง Ubuntu ของฉันแสดงขีด จำกัด ที่ 123858 ดังนั้นฉันสงสัยว่าคุณกำลังเจอกับมันด้วย 300 แต่ pthread_create ของคุณจะกลับมาไม่เป็นศูนย์ถ้าคุณเป็นเช่นนั้น อย่าลืมตรวจสอบค่าส่งคืน

คอมไพล์ด้วย -g และรันด้วย gdb เพื่อแก้ไขข้อผิดพลาดในการแบ่งเซ็กเมนต์ แทนที่จะคาดเดาสาเหตุ มันจะชี้คุณไปยังบรรทัดที่แน่นอนและบอกค่าตัวแปรที่แน่นอนที่ทำให้เกิดความผิดพลาด

นอกจากนี้ ฉันอยากจะแนะนำปัญหาการซิงโครไนซ์ที่เป็นไปได้ เช่น mutexes ที่หายไป แต่หากนั่นเป็นสาเหตุ คุณมักจะพบปัญหาเกี่ยวกับค่า N ที่น้อยลง แม้ว่าจะไม่บ่อยนักก็ตาม

person Karl Bielefeldt    schedule 02.10.2010