Şimdi iki iş parçacığı arasında karşılıklı dışlamayı nasıl uygulayacağımızı görelim.
Amacımız, paylaşılan bir veri yapısı üzerinde aynı anda yalnızca bir iş parçacığının işlem yapmasıdır.
Değil mi?
Yani yapacağımız şey, her şeyden önce mutex tipi değişkenimizi almamız gerektiğidir.
Bu nedenle, bu küresel veri yapısını sürecin iki eşzamanlı iş parçacığı tarafından iş parçacığı güvenli olmayan erişime
karşı korumak için kullanılacak küresel bir muteks aldık.
Doğru.
Ve uygulamanız veya işleminiz başladığında, ana işlevde bu muteksi başlatmanız yeterlidir,
değil mi?
Artık muteksiniz kullanıma hazırdır.
Bundan sonra yapacağım şey, karşılıklı dışlamayı uygulamak için bu mutex değişkenini
kullanacağım.
Şimdi diziye gerçekten erişen iş parçacıklarına gelelim.
Şimdi, bir dizi olan global veri yapım üzerinde okuma ve yazma işlemini gerçekleştiren
iş parçacıklarına geliyoruz.
Burada Swap adında bir iş parçacığı geri çağırma işlevim olduğunu görebilirsiniz.
Ve bu fonksiyonda dizinin ilk ve son elemanını değiştiriyorum.
Bu nedenle, iş parçacığının dizi üzerinde yazma işlemini gerçekleştirdiği mantığı basitçe sandviç yapacağım.
Doğru.
Bu yüzden dizinin iki elemanını iş parçacığı muteksi, kilitleme ve kilit açma arasında değiştirmenin tüm
mantığını sandviç yapacağım.
Doğru.
Benzer şekilde, bir iş parçacığının dizinin öğelerinin toplamını hesapladığı sum adlı başka bir iş parçacığı geri
çağırma işlevi vardır.
Bu yüzden, dizinin elemanları üzerinde yineleme yaptığım ve toplamı hesapladığım tüm mantığı sandviç
yapacağım.
Burada, dizinin elemanlarının toplamını hesaplama mantığını thread, mutex, lock ve thread, mutex
ve lock arasında sandviç yaptığımı görebilirsiniz.
Doğru.
Yani bu basitçe, t bir iş parçacığı dizinin elemanlarının toplamını hesapladığında, bu muteksi kilitleyeceği
anlamına gelir.
Değil mi?
Ve bu muteks kilitliyken, diğer iş parçacığı dizinin iki elemanını değiştirmeye
çalışırsa, muteksi kilitli durumda bulacak ve bu nedenle ikinci iş parçacığı 82 numaralı satırda bloke
olacaktır.
Doğru.
Yani temel olarak burada kod kilitlemeyi konuşlandırdım.
Kodun muteks kullanan kısmını kilitliyorum.
Şimdi, bu programı derleyip çalıştırırsanız, çıktının her zaman 15 olması garanti edilir, bu da yazar iş parçacığı
dizi üzerindeki işlemini tamamen bitirdiğinde beklenir.
Daha sonra sadece okuyucu iş parçacığı dizinin elemanlarının toplamını hesaplamaya çalışır.
Doğru.
Ve okuyucu iş parçacığı dizinin elemanlarının toplamını hesaplarken, yazıcı iş parçacığı dizinin elemanlarını
bu kadar basit bir şekilde değiştiremez.
Böylece karşılıklı dışlama garanti altına alınır ve bu nedenle programınız bu karşılıklı dışlama korumasıyla
çalıştırıldığında, programınız 15 olarak toplam olan doğru çıktıyı üretecektir.
Doğru.
Bu, mutekslerin veri yapıları üzerinde çakışan işlemleri gerçekleştiren iki iş parçacığı arasında karşılıklı dışlama
sağlamak için nasıl kullanıldığına bir örnektir.
Elbette bu kursun ileri düzey bölümüne ilerledikçe Mutex'lerin daha gelişmiş kullanımıyla
ilgilenecektik.