ฉันมีเธรดผู้บริโภคหลายรายการและเธรดผู้ผลิตหนึ่งรายการ เธรดของผู้ผลิตจะเขียนข้อมูลลงในแผนที่ซึ่งเป็นของเธรดของผู้บริโภคและส่งสัญญาณไปยังเธรดของผู้บริโภค ฉันกำลังใช้ mutexes ทั่วทั้งแผนที่เมื่อฉันแทรกและลบข้อมูล อย่างไรก็ตามวิธีนี้ดูไม่มีประสิทธิภาพในแง่ของประสิทธิภาพความเร็ว คุณช่วยแนะนำวิธีอื่นแทนแผนที่ซึ่งต้องใช้การล็อคและปลดล็อค mutex และฉันคิดว่า mutex ทำให้การส่งสัญญาณช้าลง
c ++ การประมวลผลช้าแบบมัลติเธรด
คำตอบ (2)
อย่างไรก็ตามวิธีนี้ดูไม่มีประสิทธิภาพในแง่ของประสิทธิภาพความเร็ว คุณช่วยแนะนำวิธีอื่นแทนแผนที่ซึ่งต้องใช้การล็อคและปลดล็อค mutex และฉันคิดว่า mutex ทำให้การส่งสัญญาณช้าลง
คุณควรใช้ตัวสร้างโปรไฟล์เพื่อระบุจุดคอขวด
เธรดของผู้ผลิตจะเขียนข้อมูลลงในแผนที่ซึ่งเป็นของเธรดของผู้บริโภคและส่งสัญญาณไปยังเธรดของผู้บริโภค
ผู้ผลิตไม่ควรกังวลว่าผู้บริโภคใช้โครงสร้างข้อมูลประเภทใด แต่เป็นรายละเอียดการใช้งานของผู้บริโภค โปรดทราบว่าการแทรกค่าลงในแผนที่จำเป็นต้องมีการจัดสรรหน่วยความจำ (เว้นแต่ว่าคุณกำลังใช้ตัวจัดสรรแบบกำหนดเอง) และการจัดสรรหน่วยความจำจะต้องล็อกภายในเช่นกันเพื่อปกป้องสถานะของฮีป ผลลัพธ์ที่ได้คือการล็อค mutex รอบ ๆ การดำเนินการ map::insert
อาจจะล็อคมันนานเกินไปจริง ๆ
การออกแบบที่เรียบง่ายและมีประสิทธิภาพมากขึ้นก็คือการมีคิวอะตอมมิกระหว่างผู้ผลิตและผู้บริโภค (เช่น ไปป์, TBB concurrent_bounded_queue ซึ่งจะจัดสรรพื้นที่เก็บข้อมูลล่วงหน้าเพื่อให้การดำเนินการแบบพุช/ป๊อปทำได้รวดเร็วมาก) เนื่องจากโปรดิวเซอร์ของคุณสื่อสารโดยตรงกับผู้บริโภคแต่ละรายว่าคิวเป็นแบบนักเขียนหนึ่งคนและผู้อ่านหนึ่งคน และสามารถใช้เป็นคิวโดยไม่ต้องรอ (หรือบัฟเฟอร์วงแหวน a-la ตัวขัดขวาง C++)
Andrei Alexandrescu ชี้ให้เห็นข้อดีตรงที่คุณควรวัดผลโค้ดของคุณ (https://www.facebook.com/notes/facebook-engineering/three-optimization-tips-for-c/10151361643253920) และนี่คือคำแนะนำเดียวกับที่ฉันจะให้คุณซึ่งก็คือการวัดผล รหัสของคุณและดูว่าคุณได้รับความแตกต่างด้านประสิทธิภาพระหว่างการทดสอบพื้นฐานและการทดสอบที่ใช้เธรดเดี่ยว:
- เวลาที่ต้องใช้ในการแทรกข้อมูลโดยใช้เธรดเดียวเพื่อแมปกับข้อมูลที่แสดงไว้ข้างต้น
- เวลาที่ต้องใช้ในการแทรกข้อมูลโดยใช้เธรดเดี่ยวเพื่อแมปกับข้อมูลที่แสดงไว้ด้านบน และใช้การล็อก 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/
หากคุณสามารถให้รายละเอียดเพิ่มเติมได้ เช่น เหตุใดจึงต้องล็อกแผนที่ตลอดเวลา เราอาจสามารถร่างกลไกที่มีประสิทธิภาพดีขึ้นได้