17 Ekim 2017 Salı

Interlocked Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.Threading;
C#'ta AtomicXXX sınıfları yerine Interlocked isimli tek bir sınıf var.

Interlocked Kullanmaya Gerek Olmayan Durumlar
Bazı değişkenlere değer ataması yaparken Interlocked kullanmaya gerek yok çünkü C# bu işlemin atomic olmasını garanti ediyor.

Örnek
Şöyle yaparız. decimal bir class olmadığı ve native word size 64 ise bundan da büyük olduğu için atomic değil.
int x;
x = 10; // atomic
decimal d;

d = 10m; // not atomic
Reference assignment atomic. Şöyle yaparız.
private String _text;
public void Method(String text)
{
  _text = text; // atomic
}
Interlocked Kullanmaya Gerek Olan Durumlar
Örnek
Şu kod atomic değil! Burada Interlocked.Increment() metodu kullanmaya gerek var.
public class InMemoryCounter
{
  private int count;

  public void Increment()
  {
    count++;// Not thread-safe
  }
}
Add metodu
Int alan metodun imzası şöyle.
public static int Add(ref int location1,int value)
Int64 alan metodun imzası şöyle
public static Int64 Add(ref Int64 location1, Int64 value)
İlk parametre ref olarak geçilmesine rağmen sonuç için ilk parametreye değil çağrı sonucuna bakmak gerekir.
Örnek
Şöyle yaparız
int a = 5;
int b = Interlocked.Add(ref a, 5); // b = 10
Örnek
Eğer Add metodunu if a = 0 gibi kullanmak istersek while döngüsü içine alırız.
while (Interlocked.Add(ref member, 0) == someValue) 
{
    //do yet another something
}
CompareExchange metodu
İkinci parametre benim bayrağa atamak istediğimi değer, birincisi ise bayrağımın başlangıçta olması gereken değerdir. İşlem başarılı ise atamak istediğim değer döner.
Örnek
Bir değişkene değer atamak için şöyle yaparız.
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
Örnek
Bir referansı değiştirmek için şöyle yaparız.
ImmutableList<String> list = ImmutableList<String>.Empty;
void ModifyOperation(String example)
{
  ImmutableList<String> original;
  ImmutableList<String> new;
  do
  {
    original = list;
    new = list.Add(example);
  }
  while (Interlocked.CompareExchange(ref list, new, original) != original);
}
Exchange metodu
Açıklaması şöyle. Yani setter olarak kullanılabilir.
"Sets a [32-bit signed integer] to a specified value and returns the original value, as an atomic operation."
Şöyle yaparız.
int currentCount = Interlocked.Exchange(ref count, 0)
Increment metodu
Şöyle yaparız.

int count;

Interlocked.Increment(ref count);


Hiç yorum yok:

Yorum Gönder