Yazan : Şadi Evren ŞEKER

Kelime anlamı olarak bir değişkenin geçici, uçucu değere sahip olmasını ifade eder.

Volatile tip tanımlayıcısı (Volatile Type Quantifier) basitçe bir değişken tanımının başında bulunup, bu değişkenin, program dışında bir etki altında bulunabileceğini ifade eder.

Örneğin geliştirdiğimiz bir programda, farklı işlem (process) veya donanımsal etkiler sonucunda değeri değişen bir değişken (variable) kullanıyorsak, bu değişkeni volatile olarak tanımlamamız gerekir. Aksi halde derleyici (compiler) bu değişkeni optimize ederek görevini yerine getiremez bir hale sokabilir.

Bu durumun çok klasik örneklerini IPC (inter process communication, işlemler arası iletişim) konularında görebiliriz.

Klasik bir bariyer kullanılacağını ve işlemin bu bariyere belirli bir amaç için takılacağını düşünelim.

C dilinde böyle bir örneği aşağıdaki şekilde kodlayabiliriz:

int bar = 0;
while(bar == 0);

Yukarıdaki iki satırda görüldüğü üzere “bar” isminde bir değişken tanımlanmış ve bu değişkenin, değeri 0 olduğu sürece sonsuz döngüye girilmiştir. Elbette bu aşamada kod sonsuz döngüye girecek ve ilerlemeyecektir.

Yukarıdaki bu bariyeri kırmak için farklı bir işlem tarafından “bar” değişkeninin değeri değiştirilmek istenirse, bu durumda değişkene müdahale edilememesi söz konusu olabilir. Kullanılan derleyicinin optimize etme seviyesine bağlı olarak, belki de derleyici bu değişken değerini hiç tutmadan ve işletim sistemi üzerinde işlemciye bile uğramadan programı bekletme şekline geçirmiş olabilir.

Derleyicinin bu seviyede bir optimizasyon yapması sonucu değişkene erişmek ve dolayısıyla değişkenin değerini değiştirip, yukarıdaki bariyeri kırmak mümkün olmaz. Bunu engellemek için değişken tanımında volatile kelimesi kullanılır.

volatile int bar= 0;
while(bar==0);

Yeni kodumuzun tek farkı, derleyicinin bu kodda bulunan “bar” değişkenini optimize etmeyecek olmasıdır. Bu sayede kod gerçekten verimsiz bir şekilde çalışacak ancak değişkenin bütün beklentileri karşılaması sağlanacaktır.

Yukarıdaki bu durum, C, C++ dilleri için geçerli ve kullanışlıdır.

JAVA ve C# dilleri için durum biraz farklıdır. Bu dillerde yukarıda anlatılan problemin çözümü için hem volatile hem de synchronized tip tanımlayıcıları (type qunatifiers) bulunur.

Bu dilleri kullanan kişilerin bu iki tip tanımlayıcısı arasındaki farkı bilmesi gerekir.

Synchronized olarak tanımlanmış bir değişken yukarıda anlatılan sorunu çözer ancak JAVA veya C# dillerinin nesne yönelimli programlama özelliğinden dolayı, bu değişkenin tanımlı olduğu sınıftan (class), birden fazla nesne tanımlanması mümkündür.

Örneğin lif (thread) özelliği taşıyan bir java sınıfından tanımlanan bütün nesneler (objects), performans kaygılarından dolayı kendi değişken kopyalarını tutarlar. Dolayısıyla her nesnede kendi değişken bilgisi durur.

Volatile olarak tanımlanan değişkenin farkı ise burada ortaya çıkar. Synchronized tanımlı bir değişkenden farklı olarak, volatile değişken sadece tek bir kopya tutar. Bu kopyaya ana kopya ismi de verilebilir. Tasarıma göre değişmekle birlikte, birden çok kopyanın, tek kopya üzerinden güncellenmesi ve hepsinin aynı olması da aslında tek kopya tutulması olarak düşünülebilir.

Yorumlar

  1. Şadi Evren ŞEKER Article Author

    bu sorunun bu konu ile nasıl bir ilgisi var? daha doğrusu bu kavram, “volatile anahtar” tam olarak nerede ve nasıl geçmekte, biraz sorunuzu açarsanız sanırım yardım edebilirim.

    başarılar

  2. Fatih Kabakcı

    C de kullanılan veri türleri ile alakalı oldugu icin bu kısımda yazmistim.volatile de bir veri türünün basında tanimlandigi icin bu anahtar kelimenin tam olarak gorevi nedir anlayamamıstım hocam o yüzden sormustum

Şadi Evren ŞEKER için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir