ทำไมฉันจึงควรเลือกอย่างใดอย่างหนึ่งในทางปฏิบัติ อะไรคือความแตกต่างทางเทคนิคยกเว้น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