ในการอ้างถึงหน้าคน:
เมื่อใช้ตัวแปรเงื่อนไขจะมีเพรดิเคตของบูลีนที่เกี่ยวข้องกับตัวแปรที่แชร์ซึ่งเกี่ยวข้องกับแต่ละเงื่อนไขรอซึ่งเป็นจริงถ้าเธรดควรดำเนินการต่อ การปลุกที่เกิดขึ้นจริงจาก pthread_cond_timedwait () หรือฟังก์ชั่น pthread_cond_wait () อาจเกิดขึ้นได้ เนื่องจากการส่งคืนจาก pthread_cond_timedwait () หรือ pthread_cond_wait () ไม่ได้มีความหมายอะไรเกี่ยวกับมูลค่าของเพรดิเคตนี้เพรดิเคตควรได้รับการประเมินอีกครั้งเมื่อส่งคืนดังกล่าว
ดังนั้นpthread_cond_wait
สามารถส่งคืนแม้ว่าคุณจะไม่ได้ส่งสัญญาณ อย่างน้อยครั้งแรกที่ดูเหมือนว่าเลวร้าย มันจะเป็นฟังก์ชั่นที่สุ่มคืนค่าผิดหรือสุ่มคืนก่อนที่มันจะถึงคำสั่ง return ที่เหมาะสม ดูเหมือนว่าเป็นข้อบกพร่องที่สำคัญ แต่ความจริงที่ว่าพวกเขาเลือกที่จะจัดทำเอกสารนี้ในหน้าคนมากกว่าแก้ไขดูเหมือนว่าจะมีเหตุผลที่ถูกต้องว่าทำไมpthread_cond_wait
ตื่นขึ้นมาอย่างเก๊ สันนิษฐานว่ามีบางอย่างที่แท้จริงเกี่ยวกับวิธีการทำงานที่ทำให้ไม่สามารถช่วยเหลือได้ คำถามคืออะไร
ทำไมไม่pthread_cond_wait
กลับ spuriously? ทำไมถึงไม่สามารถรับประกันได้ว่าจะมีการปลุกเมื่อมีการส่งสัญญาณอย่างถูกต้องเท่านั้น ทุกคนสามารถอธิบายเหตุผลของพฤติกรรมหลอกลวงได้หรือไม่
pthread_cond_(timed)wait
: "หากมีการส่งสัญญาณ ... เธรดจะดำเนินการต่อเพื่อรอตัวแปรเงื่อนไขราวกับว่ามันเป็น ไม่ขัดจังหวะหรือมันจะกลับเป็นศูนย์เนื่องจากการปลุกปลอม " ฟังก์ชั่นการปิดกั้นอื่น ๆ ระบุEINTR
เมื่อถูกขัดจังหวะด้วยสัญญาณ (เช่นread
) หรือจำเป็นต้องกลับมาทำงาน (เช่นpthread_mutex_lock
) ดังนั้นหากไม่มีเหตุผลอื่นใดที่ทำให้ตื่นขึ้นมาอย่างpthread_cond_wait
ไม่น่าเชื่ออาจถูกนิยามเหมือนอย่างใดอย่างหนึ่ง