การวางไข่เธรดให้การรับประกันคำสั่งหน่วยความจำด้วยตัวเองหรือไม่?


20

ฉันต้องการทำอย่างนี้:

กระทู้เริ่มต้น:

  • เขียนค่าบางอย่างไปยัง vars ส่วนกลาง (จะไม่ถูกเขียนอีกครั้ง)
    • นี่อาจเป็นข้อมูลขนาดใหญ่พอสมควร (อาร์เรย์สตริง ฯลฯ ) สามารถไม่เพียง std::atomic<>แต่จะทำ
  • วางไข่หัวข้ออื่น ๆ

หัวข้ออื่น ๆ :

  • อ่านสถานะโลก
  • ทำงาน ฯลฯ

ตอนนี้ฉันรู้ว่าฉันสามารถส่งผ่านข้อโต้แย้งไปstd::threadได้ แต่ฉันพยายามเข้าใจการรับประกันหน่วยความจำของ C ++ ผ่านตัวอย่างนี้

นอกจากนี้ฉันค่อนข้างมั่นใจว่าในการใช้งานจริงใด ๆ การสร้างเธรดจะทำให้สิ่งกีดขวางหน่วยความจำทำให้มั่นใจว่าเธรดสามารถ "เห็น" ทุกสิ่งที่เธรดเธรดเขียนขึ้นจนถึงจุดนั้น

แต่คำถามของฉันคือ: สิ่งนี้รับประกันโดยมาตรฐานหรือไม่

นอกเหนือ: ฉันคิดว่าฉันสามารถเพิ่มหุ่นบางตัวstd::atomic<int>หรือมากกว่านั้นและเขียนลงในนั้นก่อนที่จะเริ่มหัวข้ออื่น ๆ จากนั้นในหัวข้ออื่น ๆ อ่านครั้งเดียวเมื่อเริ่มต้น ฉันเชื่อว่าสิ่งที่เกิดขึ้นก่อนที่เครื่องจักรจะรับประกันได้ว่ารัฐทั่วโลกที่เขียนไว้ก่อนหน้านี้จะมองเห็นได้อย่างถูกต้อง

แต่คำถามของฉันคือถ้าสิ่งที่ต้องการในเชิงเทคนิคหรือการสร้างเธรดเพียงพอหรือไม่


ฉันคิดว่าฉันสามารถเพิ่มหุ่นบางstd::atomic<int>...std::atomic_thread_fenceคุณสามารถใช้
Rin Kaenbyou

@NathanOliver d'oh ลบความคิดเห็นแล้ว ฉันไม่สามารถนับได้ว่าคุณช่วยฉันที่นี่บ่อยแค่ไหนไม่ว่าคำถามของฉันจะโง่แค่ไหน ...
idclev 463035818

1
@ idclev463035818 ไม่ต้องกังวล มันเกิดขึ้นกับพวกเราทุกคน
NathanOliver

คำตอบ:


26

การสร้างกระทู้ก็เพียงพอแล้ว มีจุดซิงโครไนซ์ระหว่างตัวสร้างเธรดและจุดเริ่มต้นของเธรดใหม่ต่อ[thread.thread.constr] / 7

การประสานข้อมูล:fเสร็จสิ้นการอุทธรณ์ของนวกรรมิกประสานกับจุดเริ่มต้นของการภาวนาสำเนาที่

ซึ่งหมายความว่าสถานะทั้งหมดในเธรดก่อนที่จะสร้างเธรดใหม่จะปรากฏต่อเธรดที่สร้างใหม่

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