Makale Özeti

Bu makalede multi thread çalışma ile ilgili olan thread senkronizasyonunun C# ve VB.NET ile gerçekleştirilmesi anlatılmıştır.

Makale

SyncLock & lock Deyimleri

Visual Basic .NET ‘te SyncLock ve C# ‘ta kullanılan lock deyimleri, senkronizasyon ve thread güvenliği sağlamanın yöntemlerinden bir tanesidir. 
Her iki dilde de var olan bu basit yapı, bir blok içerisindeki kodların, bir thread’in çalışması bitene kadar, başka bir thread’in çalıştırabilmesini önlemektir.

İpucu : Herhangi bir t anında sadece tek bir thread tarafından çalıştırılması gereken kodlara terminolojide kritik kodlar denilir. 
(Bu kavram yabancı kaynaklarda critical section biçiminde anılmaktadır) Bir
thread kritik kodu çalıştırıyorken diğer bir thread kritik koda girmek isterse,
birinci thread kritik koddan çıkana kadar, diğerinin işlemci zamanı tüketmeksizin bekletilmesi gerekir.

SyncLock ve lock anahtar sözcükleri, bir blok oluşturmalıdır. Oluşan bu blok içerisine kritik kodlar yazılır.

[VB.NET]

SyncLock (referans_değeri)
    ‘ Kritik kodlar
End SyncLock

[C#]

lock (referans_değeri)
{
    // Kritik kodlar
}

Dikkat : SyncLock ve lock anahtar sözcüklerinin yanına açılan parantezler içerisinde mutlaka bir referans değeri bulunmalıdır. 
Örneğin herhangi bir sınıf türündeki nesne, string ya da delegate.

Örnek : 



[VB.NET]

Class Sample

    Public Sub Func()

        Dim i As Integer

        Dim lck As String = "locking"

        SyncLock (lck)

            For i = 1 To 5

                Console.WriteLine("Func -> {0}",i)

            Next

            Console.WriteLine()

        End SyncLock

    End Sub

End Class

Module Module1

    Sub Main()

        Dim obj As New Sample

        Dim t1 As New Thread(AddressOf obj.Func)

        Dim t2 As New Thread(AddressOf obj.Func)

        Dim t3 As New Thread(AddressOf obj.Func)

        t1.Start()

        t2.Start()

        t3.Start()

    End Sub

End Module


[C#]

class Sample

{

    public void Func()

    {

        int i;

        string lck = “locking”;

        lock (lck)

        {

            for (i = 1; i <= 5; ++i)

            {

                Console.WriteLine("Func -> {0}",i); 

            }

            Console.WriteLine();   

        }

    }

}

class Class1

{

    static void Main(string[] args)

    {

        Sample obj = new Sample();

        Thread t1=new Thread(new ThreadStart(obj.Func));

        Thread t2=new Thread(new ThreadStart(obj.Func));

        Thread t3=new Thread(new ThreadStart(obj.Func));

        thr1.Start();

        thr2.Start();

        thr3.Start();

    }

}

İpucu : Kritik kodların yer aldığı fonksiyon bir sınıfın nesne bağımlı (instance) bir metodu ise; 
SyncLock ve lock parantezlerine [Me, this] değerleri geçilebilir. Tersi durumda yani metot statik ise; bir derleme zamanı hatası oluşacaktır.
 
Aykut TAŞDELEN
MVP (MS Most Valuable Professional)