คำถามติดแท็ก stdthread

6
เกิดอะไรขึ้นกับเธรดที่แยกออกเมื่อ main () ออกมา
สมมติว่าฉันเริ่มต้นstd::threadและจากนั้นdetach()เธรดจึงยังคงดำเนินการต่อแม้ว่าสิ่งstd::threadนั้นจะเป็นตัวแทนของมันก็ตาม สมมติเพิ่มเติมว่าโปรแกรมไม่มีโพรโทคอลที่เชื่อถือได้สำหรับการเข้าร่วมเธรดที่ดึงออก1ดังนั้นเธรดที่แยกออกมายังคงทำงานเมื่อmain()ออกจาก ฉันไม่พบสิ่งใดในมาตรฐาน (แม่นยำกว่าในร่าง N3797 C ++ 14) ซึ่งอธิบายสิ่งที่ควรเกิดขึ้นทั้ง 1.10 และ 30.3 ไม่มีถ้อยคำที่เกี่ยวข้อง 1อีกคำถามที่อาจเทียบเท่ากันคือ: "สามารถรวมเธรดที่แยกออกมาได้อีกครั้ง" เนื่องจากโปรโตคอลใดก็ตามที่คุณคิดค้นเพื่อเข้าร่วมส่วนการส่งสัญญาณจะต้องทำในขณะที่เธรดยังทำงานอยู่และตัวกำหนดตารางเวลาระบบปฏิบัติการอาจ ตัดสินใจที่จะทำให้เธรดเข้าสู่โหมดสลีปเป็นเวลาหนึ่งชั่วโมงหลังจากดำเนินการส่งสัญญาณโดยไม่มีวิธีสำหรับการสิ้นสุดการรับเพื่อตรวจสอบความน่าเชื่อถือของเธรดที่เสร็จสิ้น ถ้าวิ่งออกมาจากmain()กับหัวข้อแฝดทำงานเป็นพฤติกรรมที่ไม่ได้กำหนดไว้แล้วใด ๆ ที่ใช้std::thread::detach()เป็นพฤติกรรมที่ไม่ได้กำหนดเว้นแต่หัวข้อหลักไม่เคยออกจาก2 ดังนั้นการรันmain()เธรดที่แยกออกมาจะต้องมีเอฟเฟกต์ที่กำหนดไว้ คำถามคือ: ที่ไหน (ในมาตรฐาน C ++ , ไม่ใช่ POSIX, ไม่ใช่ OS เอกสาร, ... ) เป็นเอฟเฟกต์เหล่านั้นที่กำหนดไว้ 2ไม่สามารถเข้าร่วมเธรดเดี่ยวได้ (ในแง่ของstd::thread::join()) คุณสามารถรอผลจากหัวข้อแฝด (เช่นผ่านทางในอนาคตจากstd::packaged_taskหรือโดยสัญญาณการนับหรือธงและตัวแปรสภาพ) แต่ที่ไม่ได้รับประกันว่าด้ายได้เสร็จสิ้นการดำเนินการ อันที่จริงถ้าคุณใส่ส่วนการส่งสัญญาณเข้าไปในเตาเผาของวัตถุอัตโนมัติครั้งแรกของด้ายที่มีจะโดยทั่วไปจะเป็นรหัส (destructors) ที่ระยะหลังรหัสการส่งสัญญาณ หากระบบปฏิบัติการจัดตารางเวลาเธรดหลักเพื่อใช้ผลลัพธ์และออกก่อนที่เธรดที่แยกออกจะเสร็จสิ้นการรัน destructors ที่กล่าวไว้สิ่งใดที่ ^ Wis จะนิยามไว้จะเกิดอะไรขึ้น

5
เมื่อใดที่ฉันควรใช้ std :: thread :: detach
บางครั้งฉันต้องใช้std::threadเพื่อเร่งความเร็วการสมัครของฉัน ฉันก็รู้เช่นกันjoin()รอจนกว่าเธรดจะเสร็จสมบูรณ์ สิ่งนี้ง่ายต่อการเข้าใจ แต่ความแตกต่างระหว่างการโทรdetach()และไม่เรียกมันคืออะไร ฉันคิดว่าไม่มีdetach()วิธีของเธรดจะทำงานโดยใช้เธรดอย่างอิสระ ไม่ถอด: void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called without detach"); }); //some code here } การโทรด้วยการถอดออก: void Someclass::Somefunction() { //... std::thread t([ ] { printf("thread called with detach"); }); t.detach(); //some code here }
140 c++  c++11  stdthread 

10
การรวมเธรดใน C ++ 11
คำถามที่เกี่ยวข้อง : เกี่ยวกับ C ++ 11: C ++ 11: std :: เธรดรวม? async (เปิดตัว :: async) ใน C ++ 11 จะทำให้เธรดพูลล้าสมัยเพื่อหลีกเลี่ยงการสร้างเธรดที่มีราคาแพงหรือไม่ เกี่ยวกับ Boost: C ++ เพิ่มเธรดใช้เธรดซ้ำ เพิ่ม :: เธรดและสร้างกลุ่มของพวกเขา! ฉันจะได้รับกลุ่มเธรดเพื่อส่งงานโดยไม่ต้องสร้างและลบซ้ำแล้วซ้ำอีกได้อย่างไร ซึ่งหมายความว่าเธรดแบบถาวรจะซิงโครไนซ์ใหม่โดยไม่ต้องเข้าร่วม ฉันมีรหัสที่มีลักษณะดังนี้: namespace { std::vector<std::thread> workers; int total = 4; int arr[4] = {0}; void each_thread_does(int i) { arr[i] += …

6
จะตรวจสอบได้อย่างไรว่าเธรด std :: ยังทำงานอยู่หรือไม่
ฉันจะตรวจสอบได้อย่างไรว่า a std::threadยังทำงานอยู่ (ในรูปแบบที่ไม่ขึ้นกับแพลตฟอร์ม) มันขาดtimed_join()วิธีการและjoinable()ไม่มีความหมายสำหรับสิ่งนั้น ฉันคิดว่าจะล็อค mutex ด้วยstd::lock_guardเธรดและใช้try_lock()วิธีการของ mutex เพื่อตรวจสอบว่ามันยังคงถูกล็อกอยู่หรือไม่ (เธรดกำลังทำงานอยู่) แต่ดูเหมือนว่าฉันจะซับซ้อนโดยไม่จำเป็น คุณรู้วิธีที่หรูหรากว่านี้หรือไม่? อัปเดต:เพื่อความชัดเจน: ฉันต้องการตรวจสอบว่าเธรดออกอย่างสมบูรณ์หรือไม่ ถือว่าด้าย 'ห้อย' ทำงานเพื่อจุดประสงค์นี้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.