Optimizasyon etkinleştirildiğinde kodun beklendiği gibi çalışmamasını içeren geçici bir niteleyici kullanmazsak sorunlar oluşabilir. Kesintiler kullanıldığında ve etkinleştirildiğinde, kod planlandığı gibi çalışamaz. Veriler yalnızca güç açıkken geçici depolamada tutulur. Sarf malzemesi kaldırıldığında, veri kaybı olur.
Ancak, geçici olmayan depolama, güç kesilse bile verileri tutar. İşlem bilgileri, geçici olmayan depolamadan önemli ölçüde daha hızlı olduğu için geçici depolamada kısaca saklanır. Geçici olmayan depolamanın aksine, geçici depolama, hassas verileri korumak için daha uygundur. Bunun nedeni, güç kaynağı kapatıldığında verilere erişilememesidir. Geçici depolama çok maliyetli çünkü bilgisayar sistemleri yalnızca birkaç MB ile birkaç GB arasında yer alabiliyor.”
C++'da Uçucu Niteleyicinin Özellikleri
C++ uçucu niteleyici araçları burada gösterilecektir. Bir değişken tanımladığımızda “volatile” niteleyicisi uygulanır. Değerin herhangi bir zamanda değişebileceği konusunda derleyiciye bir hatırlatma görevi görür. Uçucu, aşağıda listelenen özelliklerden bazılarına sahiptir.
• Bellek ataması volatile anahtar sözcüğüyle değiştirilemez.
• Kayıt değişkenleri önbelleğe alınamaz.
• Atama açısından değer değiştirilemez.
Uçucu Niteleyicinin C++'da Kullanımı
1. Kodunuz değişkenin değerini değiştirmese de, bunu yapabilir. Sonuç olarak, derleyici değişkenin durumunu her kontrol ettiğinde, değişkenin kendisinden okunan en son değerle veya depolanan en son değerle aynı olduğunu varsayamaz; bunun yerine, değişkenin değerini bir kez daha elde etmelidir.
2. Dışarıdan görülebilen bir “yan etki” olduğundan ve bir değer uçucu bir değişkene kaydedildiğinde ortaya çıkan bir değer saklama eylemini derleyicinin ortadan kaldırmasına gerek yoktur. Örneğin, iki değer arka arkaya yerleştirilirse, derleyici değeri iki kez koymalıdır.
C++'da Uçucu Niteleyicinin Sözdizimi
# Uçucu veri_tipi değişken_adıBildirimde volatile anahtar sözcüğü kullanılmalıdır ve veri türü, double, float veya integer dahil olmak üzere herhangi bir veri türünü ifade eder. Son olarak değişken için bir isim seçiyoruz. Her iki bildirim de geçerli olduğundan, yöntemlerden birini kullanarak geçici bir değişken tanımlayabiliriz.
Örnek: Uçucu Niteleyici, C++'da Diğer İş Parçacıkları veya Dış Eylemler Tarafından Değiştirilebilecek Nesneleri Tanımlamak İçin Kullanılır
Nesne bir dış sinyal veya kesme işlevi gören bir prosedür tarafından değiştirilirse, bu arada önbelleğe alınmış durum artık uygun olmadığı için değiştirilen değerin RAM'den alınması gerekir. Sonuç olarak, derleyici geçici nesnelere erişimi uygun şekilde işler.
#include#include
#include
standart kullanarak :: cout ;
standart kullanarak :: son ;
standart kullanarak :: sertifika ;
standart kullanarak :: yemek yiyor ;
uçucu int saniye = 0 ;
geçersiz GecikmeBeşSaniye ( ) {
süre ( saniye < 3 ) {
uyu ( 200000 ) ;
sertifika << 'beklemek...' << son ;
}
}
geçersiz ArtışSaniye ( ) {
için ( int i = 0 ; i < 5 ; ++ i ) {
uyumak ( 1 ) ;
sertifika << 'arttırılmış' << son ;
saniye = saniye + 1 ;
}
}
int ana ( ) {
yapı zaman aralığı başlangıcı { } ;
yapı zaman aşımı { } ;
standart :: iplik iplik1 ;
iplik1 = standart :: iplik ( ArtışSaniye ) ;
GecikmeBeşSaniye ( ) ;
iplik1. katılmak ( ) ;
dönüş EXIT_SUCCESS ;
}
Olası senaryoyu göstermek için, “int” veri tipinin Saniyesi olarak bildirilen değişkene sahip volatile anahtar sözcüğünü kullandık ve buna 0 değeri atadık. Daha sonra iki fonksiyon oluşturuyoruz: biri global volatile tamsayı değişkenini değiştiren “DelayFiveSeconds”, diğeri ise while döngüsü içinde aynı değerlendirmeyi yapan “IncrementSeconds”. Bu örneğin, saniyelerin 3'ten az olması gerektiğinde, while döngüsünün saniyeler üzerinde döngü yapmasına izin verdiğine dikkat edilmelidir.
Koşul karşılandığında, while bloğu yürütülür. while bloğunun içinde, “waiting” ifadesini yazdıran unsleep yöntemini çağırdık. “IncrementSceonds” işlevi for döngüsüne sahiptir. Yinelemeden sonra, 'artış' ifadesini yazdıran ve 'saniye' değişkenini artıran uyku yöntemi çağrılır. “IncrementSeconds” fonksiyonunun ilk uygulaması, ana fonksiyon tarafından oluşturulan ayrı bir iş parçacığı tarafından yapılır. 'DelayFiveSeconds' yöntemi daha sonra ana iş parçacığı tarafından çağrılır ve saniye değişkeni 5 değerinin üzerine çıkmazsa bitmeyecek bir döngüye girer.
Ana iş parçacığı, saniye değişkeninin değerinin değiştiğini fark eder etmez, yöntemden geri dönecektir, çünkü başka bir iş parçacığı zaten eşzamanlı olarak artırmaya başlamıştır.
Thread kodunu C++ da çalıştırmak için “g++ -pthread –o filename filename.cc” komutunu kullanmalıyız. Komutta '-pthread' komutunu kullanmazsanız, derleyici tarafından bir istisna oluşturma olasılığı vardır. Sonuç olarak, uçucu nesne bir dış kuvvet tarafından değiştirilene kadar bekleyen bir koşullu bekleme işlevi etkin bir şekilde yaptık. Güncelleme kodu bloğunun farklı bir çeviri bölümünden veya harici sinyal eyleminden gelebileceğini akılda tutmak önemlidir, ancak bu kod geçici niteleyici kaldırılırsa ve geleneksel bir global değişken kullanılırsa yine aynı işlevi görecektir.
Çözüm
Burada, daha iyi bir anlayış için sözdizimi, kullanım ve uygun örneklerle birlikte C++'ta Uçucu'ya genel bir bakış atıyoruz. Derleyici değeri tahmin edemediğinden, volatile C programlamasında çok önemlidir. Uçucu kullanmanın birincil yararı, bir kullanıcı değiştirilmesini istediğinde veya aynı değişkeni kullanan başka bir ileti dizisi etkin olduğunda değerinin değişebilmesidir.