ทำไมฉันจึงควรเลือกอย่างใดอย่างหนึ่งในทางปฏิบัติ อะไรคือความแตกต่างทางเทคนิคยกเว้นstd::threadชั้นเรียน
std::threadทำ
std::threadหรือpthreadsไม่
ทำไมฉันจึงควรเลือกอย่างใดอย่างหนึ่งในทางปฏิบัติ อะไรคือความแตกต่างทางเทคนิคยกเว้นstd::threadชั้นเรียน
std::threadทำ
std::threadหรือpthreadsไม่
คำตอบ:
หากคุณต้องการรันโค้ดในหลาย ๆ แพลตฟอร์มให้ไปที่ Posix Threads พวกเขามีอยู่เกือบทุกที่และค่อนข้างเป็นผู้ใหญ่ ในทางกลับกันถ้าคุณใช้ Linux / gcc std::threadเพียงอย่างเดียวก็ดีมาก - มันมีระดับนามธรรมที่สูงกว่า, อินเตอร์เฟซที่ดีจริงๆและเล่นได้ดีกับคลาส C ++ 11 อื่น ๆ
คลาส C ++ 11 std::threadน่าเสียดายที่ไม่สามารถใช้งานได้กับทุกแพลตฟอร์มแม้ว่าจะมี C ++ 11 ตัวอย่างเช่นใน Android พื้นเมืองstd::threadหรือ Win64 มันใช้งานไม่ได้หรือมีปัญหาคอขวดอย่างรุนแรง (ตั้งแต่ปี 2012)
การทดแทนที่ดีคือboost::thread- มันคล้ายกันมากstd::thread(จริง ๆ แล้วมันมาจากผู้เขียนคนเดียวกัน) และทำงานได้อย่างน่าเชื่อถือ แต่แน่นอนมันแนะนำการพึ่งพาอื่นจากห้องสมุดบุคคลที่สาม
แก้ไข: ตั้งแต่ปี 2560 std::threadส่วนใหญ่ใช้งานบน Android พื้นเมือง บางคลาสstd::timed_mutexไลค์ยังไม่ถูกนำมาใช้
std::threadและสไตล์ Raii ของมันก็ดีเพราะมันสามารถจัดการกับข้อยกเว้น C ++ ในขณะที่ pthreads ไม่สามารถออกนอกกรอบได้
std::threadห้องสมุดจะดำเนินการด้านบนของ pthreads ในการสนับสนุนสภาพแวดล้อม pthreads (ตัวอย่างเช่น: libstdc ++)
ฉันคิดว่าความแตกต่างที่สำคัญระหว่างทั้งสองคือสิ่งที่เป็นนามธรรม std::threadเป็นไลบรารีคลาส C ++ std::threadห้องสมุดมีคุณสมบัติหลายอย่างที่เป็นนามธรรมเช่น: ล็อคขอบเขต, mutexes recursive อนาคต / สัญญาการใช้งานรูปแบบการออกแบบและอื่น ๆ
+1จากฉันสำหรับการชี้ให้เห็นสิ่งที่สำคัญที่สุดคือ std :: thread ให้ระดับของ abstraction ในระดับที่สูงขึ้น
std::thread ให้การพกพาในแพลตฟอร์มต่าง ๆ เช่น Windows, MacOS และ Linux
ดังกล่าวโดย @hirshhornsalz ในความคิดเห็นด้านล่างและคำตอบที่เกี่ยวข้องกับhttps://stackoverflow.com/a/13135425/1158895 , std::threadอาจไม่สมบูรณ์บนแพลตฟอร์มทั้งหมดเลย แม้จะยังคง (มันจะเป็นในอนาคตอันใกล้) มันควรจะได้รับความนิยมมากกว่าpthreadเพราะมันจะทำให้ใบสมัครของคุณพิสูจน์ได้ในอนาคต
boost::threadกับ Win64 หรือ Bionic (Android) เพราะstd::threadยังขาดชิ้นส่วนขนาดใหญ่ซึ่งบน Linux std::threadดูเหมือนว่าค่อนข้างเป็นผู้ใหญ่
สำหรับฉันความแตกต่างทางเทคนิคในการตัดสินใจคือการขาดสัญญาณดั้งเดิมใน std เมื่อเทียบกับ pthreads การไม่สามารถควบคุมสัญญาณได้อย่างถูกต้องในกระบวนการ Unix โดยใช้ std เพียงอย่างเดียวคือ AFAIK เป็นข้อบกพร่องที่ทำให้ร่างกายอ่อนแอในการใช้ std :: thread เนื่องจากไม่ได้ตั้งค่ารูปแบบการจัดการสัญญาณแบบหลายเธรด bona fide เพื่อประมวลผลสัญญาณทั้งหมดโดยเฉพาะ ด้ายและบล็อกพวกเขาในส่วนที่เหลือ คุณถูกบังคับให้ถือว่า std :: thread ถูกนำไปใช้โดยใช้ pthreads และหวังว่าจะดีที่สุดเมื่อใช้ pthread_sigmask การจัดการสัญญาณอย่างเหมาะสมนั้นไม่สามารถต่อรองได้ในการเขียนโปรแกรมระบบ Unix สำหรับองค์กร
ณ วันที่ 2016 std :: thread เป็นของเล่น ง่ายเหมือนที่
std::threadนำความปลอดภัยประเภทที่ pthread ไม่มี
OpenMP
เป็นมาตรฐานมัลติเธรดแบบ SMP ที่ทำงานบน Linux และ Windows มานานกว่าทศวรรษแล้ว OpenMP มีให้ใช้งานตามค่าเริ่มต้นกับคอมไพเลอร์ทั้งหมดรวมถึง GCC และ Microsoft Visual Studio
สิ่งหนึ่งที่ต้องระวังเมื่อใช้ OpenMP คือถ้ามีเธรดมากกว่ามีแกน CPU ประสิทธิภาพจะลดลงเนื่องจากการสลับบริบทที่เกี่ยวข้องกับค่าใช้จ่าย สิ่งที่สองที่ควรทราบคือการเริ่มต้นของระดับระบบปฏิบัติการจริงระดับเธรดนั้นค่อนข้างแพง การกำหนดค่าเริ่มต้นเป็นเพียงเสี้ยววินาที แต่ในบางแอปพลิเคชันเศษส่วนขนาดเล็กมากจะมีค่าใช้จ่ายสูง
สำหรับข้อกำหนดด้านสถาปัตยกรรมซอฟต์แวร์ที่เกี่ยวข้องกับการทำงานพร้อมกันคุณอาจต้องการค้นหาการใช้งานบางอย่างของ "Lightweight threads" หรือ "Green threads" แทนการใช้ OpenMP ความแตกต่างคือเธรด OpenMP เป็นจริงระดับระบบปฏิบัติการเธรด แต่ "เธรดสีเขียว" สามารถเป็นเพียง "เธรดที่จำลองขึ้น" ซึ่งเรียกใช้งานโดยใช้เธรดจริงจำนวนเล็กน้อย
std::async