Mengutip halaman manual:
Saat menggunakan variabel kondisi selalu ada predikat Boolean yang melibatkan variabel bersama yang terkait dengan setiap kondisi, tunggu itu benar jika utas harus dilanjutkan. Wakeups palsu dari fungsi pthread_cond_timedwait () atau pthread_cond_wait () dapat terjadi. Karena pengembalian dari pthread_cond_timedwait () atau pthread_cond_wait () tidak menyiratkan apa-apa tentang nilai predikat ini, predikat harus dievaluasi kembali setelah pengembalian tersebut.
Jadi, pthread_cond_wait
dapat kembali bahkan jika Anda belum mengisinya. Setidaknya pada pandangan pertama, itu tampak sangat mengerikan. Ini akan seperti fungsi yang secara acak mengembalikan nilai yang salah atau secara acak dikembalikan sebelum benar-benar mencapai pernyataan pengembalian yang tepat. Sepertinya bug utama. Tetapi fakta bahwa mereka memilih untuk mendokumentasikan ini di halaman manual daripada memperbaikinya tampaknya menunjukkan bahwa ada alasan yang sah mengapa pthread_cond_wait
akhirnya bangun dengan palsu. Agaknya, ada sesuatu yang intrinsik tentang cara kerjanya yang membuatnya sehingga tidak dapat membantu. Pertanyaannya adalah apa.
Mengapa tidak pthread_cond_wait
kembali spuriously? Mengapa tidak bisa menjamin bahwa itu hanya akan bangun ketika sudah diberi sinyal dengan benar? Adakah yang bisa menjelaskan alasan perilakunya yang palsu?
pthread_cond_(timed)wait
: "Jika sinyal dikirim ... utas melanjutkan menunggu variabel kondisi seolah-olah itu adalah tidak terputus, atau akan mengembalikan nol karena bangun palsu ". Fungsi pemblokiran lain menunjukkan EINTR
ketika terganggu oleh sinyal (misalnya read
), atau diminta untuk melanjutkan (misalnya pthread_mutex_lock
). Jadi jika tidak ada alasan lain untuk bangun palsu, pthread_cond_wait
bisa didefinisikan seperti salah satu dari itu.