c ++ การประมวลผลช้าแบบมัลติเธรด

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


person Avb Avb    schedule 27.09.2013    source แหล่งที่มา


คำตอบ (2)


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

คุณควรใช้ตัวสร้างโปรไฟล์เพื่อระบุจุดคอขวด


เธรดของผู้ผลิตจะเขียนข้อมูลลงในแผนที่ซึ่งเป็นของเธรดของผู้บริโภคและส่งสัญญาณไปยังเธรดของผู้บริโภค

ผู้ผลิตไม่ควรกังวลว่าผู้บริโภคใช้โครงสร้างข้อมูลประเภทใด แต่เป็นรายละเอียดการใช้งานของผู้บริโภค โปรดทราบว่าการแทรกค่าลงในแผนที่จำเป็นต้องมีการจัดสรรหน่วยความจำ (เว้นแต่ว่าคุณกำลังใช้ตัวจัดสรรแบบกำหนดเอง) และการจัดสรรหน่วยความจำจะต้องล็อกภายในเช่นกันเพื่อปกป้องสถานะของฮีป ผลลัพธ์ที่ได้คือการล็อค mutex รอบ ๆ การดำเนินการ map::insert อาจจะล็อคมันนานเกินไปจริง ๆ

การออกแบบที่เรียบง่ายและมีประสิทธิภาพมากขึ้นก็คือการมีคิวอะตอมมิกระหว่างผู้ผลิตและผู้บริโภค (เช่น ไปป์, TBB concurrent_bounded_queue ซึ่งจะจัดสรรพื้นที่เก็บข้อมูลล่วงหน้าเพื่อให้การดำเนินการแบบพุช/ป๊อปทำได้รวดเร็วมาก) เนื่องจากโปรดิวเซอร์ของคุณสื่อสารโดยตรงกับผู้บริโภคแต่ละรายว่าคิวเป็นแบบนักเขียนหนึ่งคนและผู้อ่านหนึ่งคน และสามารถใช้เป็นคิวโดยไม่ต้องรอ (หรือบัฟเฟอร์วงแหวน a-la ตัวขัดขวาง C++)

person Maxim Egorushkin    schedule 27.09.2013
comment
คุณช่วยแนะนำตัวอย่างการใช้งานคิวเหล่านี้ได้ไหม พวกเขาเป็นมาตรฐานใน STL หรือที่อื่นหรือไม่? คุณหมายถึง std::atomic ใช่หรือไม่? - person Avb Avb; 27.09.2013
comment
@AvbAvb ฉันได้เพิ่มข้อมูลอ้างอิงสองสามรายการ - person Maxim Egorushkin; 27.09.2013

Andrei Alexandrescu ชี้ให้เห็นข้อดีตรงที่คุณควรวัดผลโค้ดของคุณ (https://www.facebook.com/notes/facebook-engineering/three-optimization-tips-for-c/10151361643253920) และนี่คือคำแนะนำเดียวกับที่ฉันจะให้คุณซึ่งก็คือการวัดผล รหัสของคุณและดูว่าคุณได้รับความแตกต่างด้านประสิทธิภาพระหว่างการทดสอบพื้นฐานและการทดสอบที่ใช้เธรดเดี่ยว:

  1. เวลาที่ต้องใช้ในการแทรกข้อมูลโดยใช้เธรดเดียวเพื่อแมปกับข้อมูลที่แสดงไว้ข้างต้น
  2. เวลาที่ต้องใช้ในการแทรกข้อมูลโดยใช้เธรดเดี่ยวเพื่อแมปกับข้อมูลที่แสดงไว้ด้านบน และใช้การล็อก mutex

หากคุณยังคงมองหาคอนเทนเนอร์แบบเธรดที่ปลอดภัย คุณอาจต้องการดูการใช้งาน โอเพ่นซอร์ส ของ Intel ของ คอนเทนเนอร์แบบเธรดที่ปลอดภัย ที่ http://www.threadingbuildingblocks.org/docs/help/reference/containers_overview/concurrent_queue_cls.htm .

นอกจากนี้ สำหรับข้อเสนอแนะสำหรับการใช้งานชุดข้อความสำหรับผู้บริโภค คุณอาจต้องการอ่านบทความ ActiveObject ที่ Herb Sutter โพสต์บนเว็บไซต์ของเขา: http://Hersutter.com/2010/07/12/efficient-concurrency-prefer-using-active-objects-instead-of-naked-threads/

หากคุณสามารถให้รายละเอียดเพิ่มเติมได้ เช่น เหตุใดจึงต้องล็อกแผนที่ตลอดเวลา เราอาจสามารถร่างกลไกที่มีประสิทธิภาพดีขึ้นได้

person AhiyaHiya    schedule 27.09.2013