C ++ 11 std :: threads vs เธรด posix


157

ทำไมฉันจึงควรเลือกอย่างใดอย่างหนึ่งในทางปฏิบัติ อะไรคือความแตกต่างทางเทคนิคยกเว้นstd::threadชั้นเรียน


5
ในทางปฏิบัติคุณควรใช้std::async
เตฟาน Dollberg

@bamboon สิ่งนี้ได้รับผลกระทบจากปัญหาเช่นเดียวกับที่std::threadทำ
Gunther Piez

2
@hirschhornsalz จากมุมมองคอมไพเลอร์ - สนับสนุนใช่ จากมุมมองทางเทคนิคมันมีข้อยกเว้นความปลอดภัยซึ่งstd::threadหรือpthreadsไม่
Stephan Dollberg

15
โหวตให้เปิดใหม่ คำขอสำหรับ "ความแตกต่างทางเทคนิค" ทำให้สิ่งนี้ตอบได้อย่างเป็นกลาง คะแนนโหวตสูงบ่งชี้ว่าคนอื่น ๆ พบว่าโพสต์นี้สร้างสรรค์และเป็นประโยชน์
Adrian McCarthy

คำตอบ:


122

หากคุณต้องการรันโค้ดในหลาย ๆ แพลตฟอร์มให้ไปที่ 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ไลค์ยังไม่ถูกนำมาใช้


19
คุณมีหลักฐานใด ๆ ในการสำรองการเรียกร้อง "คอขวดประสิทธิภาพ" เหล่านี้หรือไม่ นอกจากนี้std::threadและสไตล์ Raii ของมันก็ดีเพราะมันสามารถจัดการกับข้อยกเว้น C ++ ในขณะที่ pthreads ไม่สามารถออกนอกกรอบได้
Jesse Good

9
ตอนนี้ในปี 2014 คำตอบนี้ยังคงใช้ได้หรือไม่
อนุมัติ

25
แล้วประมาณต้นปี 2560 ล่ะ
rmobis

9
แล้วตอนนี้ในปี 2560 ตอนกลาง
Lightness Races ในวงโคจร

14
แล้วตอนนี้ในปี 2018 ตอนกลาง
陳力

59

std::threadห้องสมุดจะดำเนินการด้านบนของ pthreads ในการสนับสนุนสภาพแวดล้อม pthreads (ตัวอย่างเช่น: libstdc ++)

ฉันคิดว่าความแตกต่างที่สำคัญระหว่างทั้งสองคือสิ่งที่เป็นนามธรรม std::threadเป็นไลบรารีคลาส C ++ std::threadห้องสมุดมีคุณสมบัติหลายอย่างที่เป็นนามธรรมเช่น: ล็อคขอบเขต, mutexes recursive อนาคต / สัญญาการใช้งานรูปแบบการออกแบบและอื่น ๆ


4
+1จากฉันสำหรับการชี้ให้เห็นสิ่งที่สำคัญที่สุดคือ std :: thread ให้ระดับของ abstraction ในระดับที่สูงขึ้น
sbi

33

std::thread ให้การพกพาในแพลตฟอร์มต่าง ๆ เช่น Windows, MacOS และ Linux

ดังกล่าวโดย @hirshhornsalz ในความคิดเห็นด้านล่างและคำตอบที่เกี่ยวข้องกับhttps://stackoverflow.com/a/13135425/1158895 , std::threadอาจไม่สมบูรณ์บนแพลตฟอร์มทั้งหมดเลย แม้จะยังคง (มันจะเป็นในอนาคตอันใกล้) มันควรจะได้รับความนิยมมากกว่าpthreadเพราะมันจะทำให้ใบสมัครของคุณพิสูจน์ได้ในอนาคต


2
ที่จริงแล้ว std :: threads มอบความสะดวกในการพกพาข้ามแพลตฟอร์มทั้งหมดที่รองรับ C ++ 11 ในขณะที่ POSIX threads นั้นใช้ได้เฉพาะบนแพลตฟอร์ม POSIX เท่านั้น (หรือแพลตฟอร์มที่พยายามให้เข้ากันได้น้อยที่สุด)
Tobias Langner

1
จากมุมมองเชิงปฏิบัตินี่เป็นสิ่งที่ผิด ที่จริงฉันตัดสินใจไม่กี่เดือนที่ผ่านมาเกี่ยวกับเหตุผลนี้ - มันเป็นความผิดพลาดที่สำคัญ ในทางปฏิบัติคุณต้องใช้boost::threadกับ Win64 หรือ Bionic (Android) เพราะstd::threadยังขาดชิ้นส่วนขนาดใหญ่ซึ่งบน Linux std::threadดูเหมือนว่าค่อนข้างเป็นผู้ใหญ่
Gunther Piez

1
@hirschhornsalz จุดของคำตอบของฉันคือชี้ให้เห็นประโยชน์ของการพกพาที่จัดทำโดยการใช้เธรด c ++ 11 เมื่อเปรียบเทียบกับ pthread OP ไม่ได้ถามเกี่ยวกับการเพิ่มพลัง แต่ก็พกพาได้เช่นกัน
เบรดี้

3
@hirschhornsalz, สำหรับเสียงเชิงลบและการกล่าวหาของคุณที่ไม่เคยใช้หัวข้อ, พวกเขาเป็นเพียงแค่ไม่น่าสนใจและไม่สมควรได้รับความพยายามมากในส่วนของฉัน ฉันคิดว่าอย่างน้อยก็คุ้มค่าในขณะที่กล่าวถึงความคิดเห็นที่สร้างสรรค์มากขึ้นจะได้รับการชี้ให้เห็นปัญหาที่คุณพยายามใช้ std :: thread บนแพลตฟอร์มที่แตกต่างกัน
เบรดี้

3
เพื่อสรุป c ++ 11 std :: thread สามารถใช้งานได้กับ GCC รุ่นล่าสุดเท่านั้น มันยังไม่เกือบสมบูรณ์ใน Visual Studio ดังนั้นจึงไม่สามารถใช้งานได้บน Windows และแน่นอนว่ามันหายไปจากคอมไพเลอร์เชิงพาณิชย์บน UNIXes (Sun Studio บน Solaris, HP aCC บน HP-UX, IBM vacpp บน AIX) ดังนั้นหากแพลตฟอร์มเป้าหมายของคุณคือ Linux เท่านั้น - c ++ 11 std :: thread ใช้ได้ ถ้าคุณต้องการ Windows หรือ UNIX อื่น ๆ ด้วย - boost :: thread เป็นวิธีที่จะไป
vond

7

สำหรับฉันความแตกต่างทางเทคนิคในการตัดสินใจคือการขาดสัญญาณดั้งเดิมใน std เมื่อเทียบกับ pthreads การไม่สามารถควบคุมสัญญาณได้อย่างถูกต้องในกระบวนการ Unix โดยใช้ std เพียงอย่างเดียวคือ AFAIK เป็นข้อบกพร่องที่ทำให้ร่างกายอ่อนแอในการใช้ std :: thread เนื่องจากไม่ได้ตั้งค่ารูปแบบการจัดการสัญญาณแบบหลายเธรด bona fide เพื่อประมวลผลสัญญาณทั้งหมดโดยเฉพาะ ด้ายและบล็อกพวกเขาในส่วนที่เหลือ คุณถูกบังคับให้ถือว่า std :: thread ถูกนำไปใช้โดยใช้ pthreads และหวังว่าจะดีที่สุดเมื่อใช้ pthread_sigmask การจัดการสัญญาณอย่างเหมาะสมนั้นไม่สามารถต่อรองได้ในการเขียนโปรแกรมระบบ Unix สำหรับองค์กร

ณ วันที่ 2016 std :: thread เป็นของเล่น ง่ายเหมือนที่


7
ฉันไม่เห็นด้วย. และการใช้งานสัญญาณอย่างหนักเป็นรูปแบบการออกแบบที่สามารถหลีกเลี่ยงได้สำหรับการใช้งานส่วนใหญ่
Erik Alapää

นอกจากนี้ยังstd::threadนำความปลอดภัยประเภทที่ pthread ไม่มี
alfC

-3

OpenMP

http://www.openmp.org/

เป็นมาตรฐานมัลติเธรดแบบ SMP ที่ทำงานบน Linux และ Windows มานานกว่าทศวรรษแล้ว OpenMP มีให้ใช้งานตามค่าเริ่มต้นกับคอมไพเลอร์ทั้งหมดรวมถึง GCC และ Microsoft Visual Studio

สิ่งหนึ่งที่ต้องระวังเมื่อใช้ OpenMP คือถ้ามีเธรดมากกว่ามีแกน CPU ประสิทธิภาพจะลดลงเนื่องจากการสลับบริบทที่เกี่ยวข้องกับค่าใช้จ่าย สิ่งที่สองที่ควรทราบคือการเริ่มต้นของระดับระบบปฏิบัติการจริงระดับเธรดนั้นค่อนข้างแพง การกำหนดค่าเริ่มต้นเป็นเพียงเสี้ยววินาที แต่ในบางแอปพลิเคชันเศษส่วนขนาดเล็กมากจะมีค่าใช้จ่ายสูง

สำหรับข้อกำหนดด้านสถาปัตยกรรมซอฟต์แวร์ที่เกี่ยวข้องกับการทำงานพร้อมกันคุณอาจต้องการค้นหาการใช้งานบางอย่างของ "Lightweight threads" หรือ "Green threads" แทนการใช้ OpenMP ความแตกต่างคือเธรด OpenMP เป็นจริงระดับระบบปฏิบัติการเธรด แต่ "เธรดสีเขียว" สามารถเป็นเพียง "เธรดที่จำลองขึ้น" ซึ่งเรียกใช้งานโดยใช้เธรดจริงจำนวนเล็กน้อย


6
ไม่ดูหมิ่น แต่สิ่งนี้เกี่ยวข้องกับคำถามหลักอย่างไร
SRG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.