ในเอกสารประกอบของstd::memory_order
บน cppreference.comมีตัวอย่างของการสั่งซื้อแบบผ่อนคลาย:
สั่งผ่อนคลาย
การดำเนินการของอะตอมมิกที่ติดแท็ก
memory_order_relaxed
ไม่ใช่การดำเนินการทำข้อมูลให้ตรงกัน พวกเขาไม่ได้กำหนดลำดับการเข้าถึงหน่วยความจำพร้อมกัน พวกเขารับประกันเฉพาะอะตอมมิกและความสอดคล้องของคำสั่งแก้ไขตัวอย่างเช่นเมื่อ x และ y เริ่มต้นที่ศูนย์
// Thread 1: r1 = y.load(std::memory_order_relaxed); // A x.store(r1, std::memory_order_relaxed); // B // Thread 2: r2 = x.load(std::memory_order_relaxed); // C y.store(42, std::memory_order_relaxed); // D
ได้รับอนุญาตให้สร้าง r1 == r2 == 42 เพราะถึงแม้ว่า A จะถูกจัดลำดับก่อนหน้า B ภายในเธรด 1 และ C ถูกเรียงตามลำดับก่อนหน้า D ภายในเธรด 2 ไม่มีสิ่งใดป้องกันไม่ให้ D ปรากฏก่อน A ในลำดับการปรับเปลี่ยนของ y และ B จาก ปรากฏขึ้นก่อนหน้า C ในลำดับการแก้ไขของ x ผลข้างเคียงของ D ต่อ y สามารถมองเห็นได้จากโหลด A ในเธรด 1 ในขณะที่ผลข้างเคียงของ B บน x สามารถมองเห็นได้ในโหลด C ในเธรด 2 โดยเฉพาะอย่างยิ่งสิ่งนี้อาจเกิดขึ้นหาก D เสร็จสมบูรณ์ก่อน C ใน เธรด 2 อาจเป็นเพราะคอมไพเลอร์สั่งใหม่หรือที่รันไทม์
มันบอกว่า "C เป็นลำดับก่อน D ภายในเธรด 2"
ตามคำนิยามของซีเควนซ์ - ก่อนซึ่งสามารถพบได้ในลำดับการประเมินถ้าเป็นลำดับก่อนบีการประเมินเอจะเสร็จก่อนการประเมินของบีเริ่มต้น เนื่องจาก C เป็นลำดับก่อนหน้า D ภายในเธรด 2, C ต้องทำให้เสร็จก่อนที่ D จะเริ่มต้นดังนั้นส่วนเงื่อนไขของประโยคสุดท้ายของสแนปช็อตจะไม่เป็นที่พอใจ