สมมติว่าฉันเริ่มต้น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 จะนิยามไว้จะเกิดอะไรขึ้น
std::exit
หรือออกจากmain
นั้นเพียงพอ แต่ไม่จำเป็นเพื่อตอบสนองความต้องการเหล่านี้" (ย่อหน้าทั้งหมดอาจมีความเกี่ยวข้อง) โปรดดู [support.start.term] / 8 (std::exit
เรียกว่าเมื่อmain
ส่งคืน)