Kılavuz sayfasını alıntılamak için:
Koşul değişkenlerini kullanırken, her koşulla ilişkili paylaşılan değişkenleri içeren her zaman bir Boole yüklemi, iş parçacığının devam etmesi durumunda doğru olur. Pthread_cond_timedwait () veya pthread_cond_wait () işlevlerinden sahte uyanmalar oluşabilir. Pthread_cond_timedwait () veya pthread_cond_wait () 'den dönüş bu yüklemin değeri hakkında hiçbir şey ifade etmediğinden, yüklem böyle bir dönüşte yeniden değerlendirilmelidir.
Yani, pthread_cond_wait
sinyal vermemiş olsanız bile geri dönebilirsiniz. En azından ilk bakışta, bu oldukça iğrenç görünüyor. Yanlış bir değeri rastgele döndüren veya gerçekte uygun bir dönüş ifadesine ulaşmadan rastgele dönen bir işlev gibi olur. Büyük bir hata gibi görünüyor. Ancak bunu düzeltmek yerine man sayfasında belgelemeyi seçmiş olmaları, pthread_cond_wait
sahte bir şekilde uyanmanın meşru bir nedeni olduğunu gösteriyor gibi görünüyor . Muhtemelen, nasıl çalıştığı konusunda yardımcı olabilecek bir şey vardır. Soru ne?
Neden yok pthread_cond_wait
spuriously dönmek? Neden sadece uygun şekilde sinyal verildiğinde uyanacağını garanti edemiyor? Sahte davranışının nedenini açıklayan var mı?
pthread_cond_(timed)wait
: "Bir sinyal iletilirse ... kesintiye uğramamış veya sahte uyandırma nedeniyle sıfıra dönecektir ". Diğer engelleme işlevleri, EINTR
bir sinyal (örn. read
) Tarafından kesildiğinde veya devam etmesi gerektiğinde (örn. pthread_mutex_lock
) Gösterir . Dolayısıyla, sahte uyanmanın başka bir nedeni pthread_cond_wait
olmasaydı, bunlardan biri gibi tanımlanabilirdi.