SORU
21 Aralık 2011, ÇARŞAMBA


Neden pthread_cond_wait sahte wakeups var mı?

Man sayfasına yazdığı gibi

Durum değişkenleri her zaman bir Boolean yüklem paylaşılan değişkenleri her bir durum ile ilgili belirtilerden kullanarak bekle o zaman eğer konu devam etmelisiniz. Bu pthread_cond_timedwait gelen sahte wakeups() veya pthread_cond_wait() işlevleri oluşabilir. Pthread_cond_timedwait dönüş) veya pthread_cond_wait() bu yüklem değeri, yüklem yeniden değerlendirilmesi üzerine böyle bir iade edilmelidir. hakkında hiçbir şey gelmez

Yani pthread_cond_wait eğer bir sinyal yok bile dönebilirsiniz. İlk bakışta en azından, bu çok iğrenç görünüyor. Rastgele yanlış bir değer ya da aslında doğru bir dönüş ifadesi ulaştı önce rastgele dönen bir fonksiyon gibi olurdu. Büyük bir hata gibi görünüyor. Ama adam sayfasında bu belge yerine bunu düzeltmek için seçmeleri pthread_cond_wait spuriously uyanma sona neden geçerli bir sebep olduğunu gösteriyor. Muhtemelen, bunun bir yararı olmaz o yüzden bu hale getiren bir şey nasıl çalıştığı hakkında iç var. Soru nedir.

Nedenpthread_cond_wait spuriously döner? Neden sadece düzgün sinyal uyanacak edeceğini garanti edebilir mi? Herkes sahte davranış nedenini açıklayabilir mi?

CEVAP
21 Aralık 2011, ÇARŞAMBA


Orada en az iki şey '' anlamına gelebilir: . uyandırma sahte

  • Bir iş parçacığı pthread_cond_wait bloke veya durumu sinyal yok arayın oluştu bile çağrı dönebilirsiniz.
  • Bir iş parçacığı sinyal ya da, ancak, temel yüklem artık gerçek olduğu zaman uyumu doğrularsa sonra yayın için bir çağrı yüzünden pthread_cond_wait döner engelledi.

Ama ikinci durumda ise durum değişken uygulama eski dava izin vermiyor bile oluşabilir. Tüketici sırası ve üç iş parçacığı bir yapımcı düşünün.

  • 1 iş parçacığı sadece bir unsuru dequeued ve dışlama yayımladı, ve sıra şimdi boş. İş parçacığı CPU, alınan öğe ile ne yapıyorsa.
  • İplik 2 öğe sıradan çıkarma girişimleri, ama sıra dışlama altında işaretlendiğinde boş bulur, çağırır pthread_cond_wait ve bloklar çağrı bekliyor sinyali/yayın.
  • İplik 3, zaman uyumu alır, kuyruğa yeni bir eleman ekler, durum değişkeni bildirir ve kilidi serbest bırakır.
  • 3 iplik, iplik bildirime yanıt olarak bu durumda beklemekte olan 2,, çalıştırmak için planlanıyor.
  • 2 iş parçacığı CPU ve sıra kilit kapmak için yönetir ancak, önce iplik 1 şu anki görevi tamamlar, ve daha fazla çalışmak için sıraya döndürür. Sıra kilit alır, yüklem denetler ve sıradaki iş olduğunu bulur. İplik 3, kilit takılı bültenleri, ve iplik 3 sıraya alındı bu madde ile yaptığını yapar. bu maddenin sıradan çıkarma için devam eder.
  • 2 iş parçacığı artık bir CPU alır ve kilit alır, ama yüklem denetlediğinde, sıranın boş olduğunu bulur. İplik 1 'uyandırma sahte gibi duruyor. yani' madde, çaldı 2 iş parçacığı durumu daha beklemesi gerekiyor.

Zaten her zaman bir döngü altında koşulunu kontrol etmek gerekir, eğer altta yatan durum değişkenleri sahte wakeups diğer türlü olsaydı hiç fark etmez.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Authority

    Android Auth

    3 NİSAN 2011
  • Google

    Google

    18 EYLÜL 2005
  • gsipek

    gsipek

    20 Temmuz 2007