Windows'ta std::shared_mutex için olası hata
- Bir yazılım ekibi, Windows'ta
std::shared_mutex ile ilgili beklenmedik bir davranış keşfetti.
- Bu sorun yalnızca MSVC'de ortaya çıkıyor; MinGW'de veya diğer platformlarda görülmüyor.
- Ana thread özel kilidi aldıktan sonra birden fazla alt thread paylaşımlı kilit almaya çalıştığında, yaklaşık her 1000 denemede 1 kez bir "deadlock" oluşuyor.
- Deadlock oluştuğunda yalnızca tam olarak 1 alt thread paylaşımlı kilidi başarıyla alabiliyor; kalan alt thread'ler
lock_shared() içinde sonsuza kadar bloklanıyor.
- Bu sorun,
std::shared_mutex, std::shared_lock/std::unique_lock ya da SRW fonksiyonları doğrudan çağrıldığında gözlemleniyor.
Kod örneği ve hatanın yeniden üretilmesi
- Sorunu yeniden üretebilen basit bir kod örneği sunuluyor.
- Kod, ana thread'in özel kilidi alıp birden fazla alt thread'in paylaşımlı kilidi alıp sonra bırakması sürecini tekrar ediyor.
- Bu kod, yalnızca Windows MSVC implementasyonunda
std::shared_mutex ile ilişkili hatayı gösteriyor.
Uzman görüşleri
- STL geliştiricisi, bunun bir Windows API hatası gibi göründüğünü belirtiyor.
- Hatanın nasıl raporlanması gerektiğine dair bir tartışma yürütüldü ve STL geliştiricisi hatayı dahili olarak raporladı.
- Diğer kullanıcılar da sorunu ayrıntılı biçimde inceledi ve SRWLock implementasyonundaki belirli bir hatanın daraltılmasına katkı sağladı.
GN⁺ görüşü
- Bu yazı, özellikle C++ geliştiricileri için önemli bilgiler sunuyor. Çünkü
std::shared_mutex içindeki potansiyel bir hata, çok iş parçacıklı uygulamalardaki senkronizasyon mekanizmalarını etkileyebilir.
- Hata doğrulanırsa, bu durum C++ standart kütüphanesi implementasyonuna duyulan güveni etkileyebilir. Geliştiricilerin bu tür sorunların farkında olması ve alternatif senkronizasyon mekanizmalarını değerlendirmesi gerekebilir.
- Bu sorun özellikle yüksek performanslı veya gerçek zamanlı sistemlerde önemli olabilir. Çünkü böyle sistemlerde deadlock kritik sonuçlara yol açabilir.
- Geliştiriciler, bu teknolojiyi benimsemeden önce ilgili platform ve derleyici üzerinde kapsamlı testler yaparak bu tür hataların bulunmadığını doğrulamalıdır.
- Bu sorunları azaltmak için geliştiriciler, Boost kütüphanesi gibi alternatif senkronizasyon kütüphanelerini değerlendirebilir. Boost geniş çapta test edilmiş ve birçok platformda kullanılmış olduğundan, bu tür sorunlara karşı güvenilir bir alternatif sunabilir.
1 yorum
Hacker News yorumları
Bir kullanıcı, böylesine temel bir sorunun neden bu kadar uzun süre fark edilmediğini merak ettiğini ve başka bir kullanıcının sunduğu ikna edici yanıtı anıyor. Paylaşımlı modda kilit almaya çalışan bir iş parçacığının yanlışlıkla özel modda kilit alabilmesinin mümkün olduğuna dikkat çekiyor. Bunun, paylaşımlı modda alma yapan iş parçacığı ile özel modda bırakma yapan iş parçacığı aynı anda çalıştığında atomik bit test et ve ayarla işlemlerinin çakışmasından kaynaklandığını belirtiyor.
Başka bir kullanıcı, Reader/Writer kilitlerinde ortaya çıkan ince hatalara şaşırmadığını belirtiyor ve C++11 ile
std::shared_mutexöncesinde Win32 tabanlı iç uygulamalar üzerinde çalıştığı deneyimini paylaşıyor. Paylaşımlı kilitlerle ilgili kötü deneyimleri nedeniyle, kesinlikle gerekli olmadıkça bunlardan kaçınmaya çalıştığını söylüyor.Bir kullanıcı, başlığın yanıltıcı olduğunu belirtiyor ve gerçek hatanın Windows API içindeki slim reader/writer (SRW) kilidinde olduğunu, bunun da
std::shared_mutexSRW kilidini kullanarak uygulandığı için keşfedildiğini açıklıyor. Bir Microsoft çalışanı, hatanın Windows API ekibine dahili olarak iletildiğini doğruluyor.Bir kullanıcı, aynı sorunun WINE uygulamasında da ortaya çıkıp çıkmadığını merak ediyor ve kendi özel XP kurulumunda da test etmek istediğini söylüyor. Bu kurulumda SRW API dahil çeşitli uzantılar eklediğini ve SRW uygulamasına dayanan keyed event API'de kilitlenmeye neden olan yarış durumunu düzeltmek için çekirdeği yamaladığını belirtiyor.
Programda bir hata olduğu belirtiliyor. Atomik olmayan değişkenlerle atomik değişkenler karıştırılarak
yield()kontrol döngüsünde kullanılıyor ve atomik olmayan değişkenler diğer iş parçacıklarına karşı önbellek tutarlılığı garanti etmiyor. Bu nedenle döngü sonsuza kadar çalışabiliyor.Bir kullanıcı, bu hatanın 2008'deki Vista sürümüne kadar uzandığını ve bu kadar uzun süre kimsenin fark etmemiş olmasına şaşırdığını söylüyor. Tipik
rwlockkullanımında paylaşımlı kilidin alınamadığı rastgele durumlar görülebileceğini ancak kilitlenme yaşanmadığını belirtiyor.Bir kullanıcı, Windows API için hata bildirmenin çok zor olduğunu belirtiyor ve Feedback Hub üzerinden bildirim yapmasının söylendiğini, ancak bunun neredeyse hiç işe yaramadığını eleştiriyor. Söz konusu kullanıcı, özel sahiplik sahibi bıraktıktan sonra birden fazla okuma iş parçacığının aynı anda paylaşımlı sahiplik almaya çalıştığı durumda
SRWLOCK'un kilitlenebileceği hatasını bildirdiğini söylüyor.Bir kullanıcı, geçmişte MS ürünleri satın alındığında destek vakası alınabildiğini ve gerçekten bir hata bulunursa bu destek vakasının iade edildiğini hatırlıyor. Bunun geliştiriciler için faydalı olduğunu ve MS için de gerçek sorunları bulup belgeleri iyileştirmeye yardımcı olan iyi bir geri bildirim sistemi sunduğunu belirtiyor. Bu programın hâlâ var olup olmadığını merak ediyor.
Son olarak bir kullanıcı, Windows API için hata bildirmenin zor olmasına dair hayal kırıklığını dile getiriyor.