ฉันเห็นว่าคำถามถูกเปิดใช้งานอีกครั้งด้วยค่าหัวตอนนี้ถามว่าการใช้งานจริงyield
คืออะไร ฉันจะยกตัวอย่างจากประสบการณ์ของฉัน
อย่างที่เราทราบกันดีว่าการyield
บังคับให้เธรดการเรียกต้องยกเลิกโปรเซสเซอร์ที่รันอยู่เพื่อให้เธรดอื่นถูกกำหนดเวลาให้ทำงาน สิ่งนี้มีประโยชน์เมื่อเธรดปัจจุบันทำงานเสร็จในตอนนี้ แต่ต้องการกลับไปที่หน้าคิวอย่างรวดเร็วและตรวจสอบว่าเงื่อนไขบางอย่างมีการเปลี่ยนแปลงหรือไม่ สิ่งนี้แตกต่างจากตัวแปรเงื่อนไขอย่างไร? yield
ช่วยให้เธรดกลับสู่สถานะรันได้เร็วขึ้นมาก เมื่อรอตัวแปรเงื่อนไขเธรดจะถูกระงับและต้องรอให้เธรดอื่นส่งสัญญาณว่าควรดำเนินการต่อyield
โดยพื้นฐานแล้วจะบอกว่า "อนุญาตให้เธรดอื่นทำงานได้ แต่อนุญาตให้ฉันกลับไปทำงานได้โดยเร็วที่สุดเพราะฉันคาดว่าจะมีอะไรเปลี่ยนแปลงในสถานะของฉันอย่างรวดเร็ว" สิ่งนี้บ่งบอกถึงการหมุนไม่ว่างซึ่งเงื่อนไขสามารถเปลี่ยนแปลงได้อย่างรวดเร็ว แต่การระงับเธรดจะทำให้ได้รับผลกระทบอย่างมาก
แต่พูดพล่ามพอสมควรนี่คือตัวอย่างที่เป็นรูปธรรม: รูปแบบขนานหน้าคลื่น ตัวอย่างพื้นฐานของปัญหานี้คือการคำนวณ "เกาะ" แต่ละตัวของ 1s ในอาร์เรย์แบบสองมิติที่เต็มไปด้วย 0 และ 1 "เกาะ" คือกลุ่มของเซลล์ที่อยู่ติดกันทั้งในแนวตั้งหรือแนวนอน:
1 0 0 0
1 1 0 0
0 0 0 1
0 0 1 1
0 0 1 1
ที่นี่เรามีเกาะ 1 เกาะ 2 เกาะ ได้แก่ บนซ้ายและขวาล่าง
วิธีแก้ปัญหาง่ายๆคือทำการส่งผ่านอาร์เรย์ทั้งหมดก่อนและแทนที่ค่า 1 ด้วยตัวนับที่เพิ่มขึ้นซึ่งในตอนท้ายแต่ละ 1 จะถูกแทนที่ด้วยหมายเลขลำดับตามลำดับหลักของแถว:
1 0 0 0
2 3 0 0
0 0 0 4
0 0 5 6
0 0 7 8
ในขั้นตอนต่อไปแต่ละค่าจะถูกแทนที่ด้วยค่าต่ำสุดระหว่างค่าของมันเองและค่าของเพื่อนบ้าน:
1 0 0 0
1 1 0 0
0 0 0 4
0 0 4 4
0 0 4 4
ตอนนี้เราสามารถระบุได้อย่างง่ายดายว่าเรามีเกาะสองเกาะ
ส่วนที่เราต้องการเรียกใช้แบบขนานคือขั้นตอนที่เราคำนวณค่าต่ำสุด โดยไม่ต้องลงรายละเอียดมากเกินไปแต่ละเธรดจะได้รับแถวในลักษณะที่แทรกสลับกันและอาศัยค่าที่คำนวณโดยการประมวลผลเธรดในแถวด้านบน ดังนั้นแต่ละเธรดจึงต้องล้าหลังเล็กน้อยในการประมวลผลเธรดในบรรทัดก่อนหน้า แต่ก็ต้องดำเนินการให้ทันภายในเวลาที่เหมาะสม รายละเอียดเพิ่มเติมและการนำไปใช้งานได้แสดงไว้ในเอกสารนี้ หมายเหตุการใช้งานของซึ่งจะมากหรือน้อยเทียบเท่าซีsleep(0)
yield
ในกรณีนี้yield
ถูกใช้เพื่อบังคับให้แต่ละเธรดหยุดชั่วคราว แต่เนื่องจากการประมวลผลเธรดแถวที่อยู่ติดกันจะเลื่อนไปอย่างรวดเร็วในระหว่างนี้ตัวแปรเงื่อนไขจึงเป็นตัวเลือกที่หายนะ
อย่างที่คุณเห็นyield
เป็นการเพิ่มประสิทธิภาพแบบละเอียด การใช้งานในสถานที่ที่ไม่ถูกต้องเช่นการรอในสภาพที่ไม่ค่อยเปลี่ยนแปลงจะทำให้เกิดการใช้งาน CPU มากเกินไป
ขออภัยสำหรับการพูดพล่ามยาวหวังว่าฉันจะทำให้ตัวเองชัดเจน