การหลีกเลี่ยงภาวะแข่งขันข้อมูล
ทำให้การเขียนแบบขนานปลอดภัย
การหลีกเลี่ยงภาวะแข่งขันข้อมูล เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชัน parallelize
- การแบ่งงานเป็นชิ้น
- การผสานการทำงานแบบขนานกับเวกเตอร์
- การหลีกเลี่ยงภาวะแข่งขันข้อมูล