0Pricing
Mojo Academy · บทเรียน

การหลีกเลี่ยงภาวะแข่งขันข้อมูล

ทำให้การเขียนแบบขนานปลอดภัย

การหลีกเลี่ยงภาวะแข่งขันข้อมูล เป็นบทเรียน Mojo Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Mojo Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Mojo Academy มีบทเรียนทั้งหมด 4 บทเรียน

การแข่งขันของข้อมูลคืออะไร

การแข่งขันของข้อมูลเกิดขึ้นเมื่อเธรดสองเธรดเข้าถึงหน่วยความจำเดียวกันพร้อมกัน และอย่างน้อยหนึ่งเธรดเขียนข้อมูล ผลลัพธ์จึงคาดเดาไม่ได้ ⚠️

กับดักแบบคลาสสิก

ผู้ปฏิบัติงานหลายคนที่บวกค่าเข้าผลรวมร่วมกันจะขัดแย้งกัน การอัปเดตบางส่วนสูญหาย เพราะการเขียนทับซ้อนกันและแย่งเขียนค่ากัน

total += out[i]  # shared, unsafe in parallel

เขียนลงช่องที่ไม่ทับซ้อนกัน

วิธีแก้ที่ง่ายที่สุดคือกำหนดดัชนีสำหรับเขียนให้ผู้ปฏิบัติงานแต่ละคน หากผลลัพธ์ไม่ทับซ้อนกัน ก็จะไม่มีการแข่งขัน

out[i] = compute(i)  # each i is unique

การอ่านใช้ร่วมกันได้

เธรดหลายเธรดสามารถอ่านอินพุตเดียวกันได้อย่างปลอดภัย ปัญหาจะเริ่มขึ้นเมื่อมีคนเขียนข้อมูลที่ผู้อื่นกำลังอ่านหรือเขียน

ผลรวมย่อยของแต่ละผู้ปฏิบัติงาน

สำหรับการหาผลรวม ให้ผู้ปฏิบัติงานแต่ละคนมีช่องผลรวมย่อยของตนเอง แต่ละคนจะไม่ใช้ช่องเดียวกัน การบวกจึงยังปลอดภัย

partials[c] += out[i]  # one slot per worker

รวมผลหลังจากรอทุกคนเสร็จ

เมื่อผู้ปฏิบัติงานทั้งหมดเสร็จแล้ว ให้บวกผลรวมย่อยเข้าด้วยกันในเธรดเดียว การลดรูปขั้นสุดท้ายนี้ไม่ต้องใช้การล็อก

for c in range(workers):
    total += partials[c]

หลีกเลี่ยงสถานะที่เปลี่ยนแปลงร่วมกัน

โค้ดแบบขนานที่ปลอดภัยที่สุดจะแชร์เฉพาะข้อมูลแบบอ่านอย่างเดียว เมื่อทำได้ ให้เก็บทุกส่วนที่เปลี่ยนแปลงได้ไว้เป็นส่วนตัวของผู้ปฏิบัติงานคนเดียว

ไม่รับประกันลำดับ

ผู้ปฏิบัติงานอาจเสร็จในลำดับใดก็ได้ อย่าพึ่งพาว่าชิ้นงานหนึ่งจะทำงานก่อนอีกชิ้น เพราะการจัดตารางอาจเปลี่ยนแปลงได้

ความเป็นเจ้าของของ Mojo ช่วยได้

ความเป็นเจ้าของและความหมายเชิงค่าของ Mojo ทำให้การแชร์โดยไม่ตั้งใจเกิดได้ยากขึ้น แต่การทำให้ตรรกะแบบขนานถูกต้องยังคงเป็นหน้าที่ของคุณ

ทดสอบหลายรอบ

การแข่งขันของข้อมูลซ่อนอยู่เบื้องหลังจังหวะเวลา ดังนั้นให้เรียกใช้โค้ดแบบขนานหลายครั้ง แล้วเปรียบเทียบกับผลลัพธ์อ้างอิงแบบอนุกรม

ออกแบบเพื่อกำจัดปัญหา

การป้องกันที่ดีที่สุดคือการจัดวางข้อมูลให้การเขียนไม่ทับซ้อนกัน ป้องกันการแข่งขันด้วยการออกแบบ ไม่ใช่ค่อยแก้ภายหลัง

ตรวจสอบอย่างรวดเร็ว

ผู้ปฏิบัติงานหลายคนต้องคำนวณผลรวมเดียวกันแบบขนาน

สรุปทบทวน

หลีกเลี่ยงการแข่งขันด้วยการเขียนลงช่องที่ไม่ทับซ้อน ใช้ผลรวมย่อยแยกสำหรับผู้ปฏิบัติงานแต่ละคน รวมผลหลังจากรอทุกคนเสร็จ และไม่พึ่งพาลำดับ เพื่อให้ผลลัพธ์แบบขนานยังคงถูกต้อง 🚀

คำถามที่พบบ่อย

บทเรียน “การหลีกเลี่ยงภาวะแข่งขันข้อมูล” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การหลีกเลี่ยงภาวะแข่งขันข้อมูล” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Mojo Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Mojo Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การหลีกเลี่ยงภาวะแข่งขันข้อมูล”

ทำให้การเขียนแบบขนานปลอดภัย คุณปฏิบัติ Mojo Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Mojo Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Mojo Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การหลีกเลี่ยงภาวะแข่งขันข้อมูล” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Mojo Academy นี้ได้ไหม

ได้ บทเรียน Mojo Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ฟังก์ชัน parallelize
  2. การแบ่งงานเป็นชิ้น
  3. การผสานการทำงานแบบขนานกับเวกเตอร์
  4. การหลีกเลี่ยงภาวะแข่งขันข้อมูล
← กลับไปที่ Mojo Academy