volatile anahtar kelimesi, derleyiciye değişkenin beklenmedik bir şekilde (örneğin, donanım, başka bir iş parçacığı veya kesme işleyicisi tarafından) değişebileceğini bildirir ve değerini önbelleğe almayı veya ona erişimleri optimize etmeyi yasaklar.
Kullanım Alanları:
volatile atomiklik veya senkronizasyon garanti etmez!).volatile int flag = 0; void handler() { flag = 1; // kesme işleyici } void loop() { while (!flag) { // olayı bekle } // ... }
volatile olmadan, derleyici döngüyü sonsuz döngüye dönüştürebilir (flag'ı bellekten okumaz), volatile ile değişken her seferinde bellekten okunur.
İş parçacıkları arasında bilgi alışverişi için
volatilekullanmak yeterli midir?
Sık yapılan bir hata, volatile'in iş parçacıkları arasında bellek senkronizasyonu sağladığını ve işlemleri atomik hale getirdiğini düşünmektir.
Doğru Cevap:
volatile, çoklu iş parçacıklarda veri yarışı sorunlarından korumaz ve bellek bariyerleri sağlamaz: sadece derleyiciye erişimi optimize etmemesini söyler. Garantili doğruluk için senkronizasyon primitiflerinin (mutex, atomic işlemler vb.) kullanılması şarttır.
// Bu güvenli değildir! volatile int ready = 0; void thread1() { data = 123; // veriyi yazma ready = 1; // diğer iş parçacığına sinyal gönderme } void thread2() { while (!ready); // olayı bekleme printf("data = %d ", data); // veri henüz güncellenmemiş olabilir! }
Tarihçe
volatile olarak tanımlanmadığı için, yazılım bazen donuyordu — bayrağın değişiklikleri fark edilmiyordu.volatile kullanıldı, bunun yeterli olduğunu düşündüler ve sonunda zor yakalanan hatalarla karşılaştılar: bazen iş parçacığı güncel olmayan verileri okudu veya tamamen tutarsız bir durumda oldu — atomik bir değişken veya mutex gerekliydi.volatile olmadan yazıldı/okundu ve derleyici erişimi optimize etti, bu da kayıtların yeni değerlerini tamamen göz ardı etmeye yol açtı — bazı komutlar çalışmadı.