WEBVTT

00:05.040 --> 00:11.180
Evet arkadaşlar, şimdi mutekslerin kullanımını göstereceğimiz bir örneği tartışalım.

00:11.250 --> 00:17.550
Bu örneğin amacı, bir sürecin ortak bir veri yapısı üzerinde çakışan işlemler gerçekleştiren iki

00:17.550 --> 00:24.390
iş parçacığı arasında karşılıklı dışlamayı uygulamaz veya sağlamazsanız, programımız tarafından üretilecek

00:24.390 --> 00:27.690
tanımlanmamış davranışa tanık olacağız.

00:27.690 --> 00:28.350
Doğru.

00:28.350 --> 00:33.490
Ve sonra muteksleri kullanarak bu tanımlanmamış davranış sorununu çözeceğiz.

00:33.510 --> 00:37.620
Dolayısıyla, tartışacağımız kod örneği bu konumda bulunabilir.

00:39.650 --> 00:43.740
Şimdi de tartışacağımız problem cümlesini ele alalım.

00:43.760 --> 00:50.540
Dolayısıyla, bu büyük harf D ile temsil edilen ortak bir veri yapısına sahip olduğumuz bir P sürecimiz olacak

00:50.540 --> 00:56.030
Şimdi bu veri yapısı herhangi bir şey olabilir, ancak basitlik adına, D veri yapısını

00:56.030 --> 01:01.010
1'den 5'e kadar beş öğe içeren bir dizi olarak temsil ediyoruz, değil mi?

01:01.010 --> 01:07.430
Bu yüzden çok basit bir veri yapısını ele aldım, ancak gerçekte bu veri yapısı herhangi bir veri yapısı olabilir.

01:07.430 --> 01:14.090
Bu bir bağlantı listesi, bir ağaç ya da karmaşık veri yapılarından oluşan bir koleksiyon olabilir.

01:14.540 --> 01:21.170
Yapacağım şey, programımızda bir T1 iş parçacığı oluşturmak ve bu T1 iş parçacığının

01:21.200 --> 01:28.670
şu anda bu dizide bulunan D veri yapısı üzerinde okuma işlemi gerçekleştirmesidir.

01:28.670 --> 01:29.840
Bu okuma işlemi nedir?

01:29.840 --> 01:35.780
Bu okuma işlemi hiçbir şey değildir, ancak sadece bu dizinin elemanlarının toplamını hesaplar ve

01:35.780 --> 01:37.430
doğru şekilde yazdırır.

01:38.440 --> 01:44.260
Ve bu T1 iş parçacığının bu dizi üzerinde sonsuz bir döngü içinde bu okuma işlemini gerçekleştireceğini

01:44.260 --> 01:44.950
unutmayın.

01:46.140 --> 01:46.740
Doğru.

01:47.520 --> 01:53.280
Yaptığım şey, bu dizi üzerinde yineleme yapacak, bu dizinin öğelerinin toplamını hesaplayacak

01:53.280 --> 01:58.710
ve toplamı yazdıracak bir iş parçacığı oluşturmak ve bu görevi sonsuza kadar yapmaya devam

01:58.710 --> 01:59.820
etmektir.

01:59.820 --> 02:00.480
Değil mi?

02:00.900 --> 02:09.450
Benzer şekilde, bu dizi üzerinde yazma işlemi gerçekleştirecek başka bir t iki iş parçacığı oluşturacağım.

02:09.450 --> 02:10.290
Doğru.

02:10.410 --> 02:12.270
Peki bu yazma işlemi nedir?

02:12.270 --> 02:14.720
Bu yazma işlemi çok basittir.

02:14.730 --> 02:21.240
t iki iş parçacığı bu dizinin ilk ve son elemanlarını değiştirecek ve bunu sonsuz

02:21.270 --> 02:23.820
bir döngü içinde yapacaktır.

02:24.240 --> 02:29.310
Buradaki amaç, iki iş parçacığı oluşturacak olmamızdır.

02:29.310 --> 02:34.980
Bir iş parçacığı bir okuyucu iş parçacığı ve diğer iş parçacığı bir yazar iş parçacığıdır ve her iki iş

02:34.980 --> 02:41.240
parçacığı da eylemlerini uygulama yazma iş parçacığının ortak veri yapısı üzerinde gerçekleştirecektir.

02:41.280 --> 02:46.630
T bir okuma işlemi gerçekleştirirken, t iki iş parçacığı yazma işlemi gerçekleştiriyor ve okuma yazma

02:46.630 --> 02:49.810
işlemlerinin çakışan işlemler olduğunu zaten biliyoruz.

02:50.080 --> 02:57.190
Şimdi size çok basit bir soru sorarsam, bu programı tam burada çalıştırdığımda bu programın çıktısı nedir diye

02:57.190 --> 03:03.430
sorarsam, thread t one'ın dizinin elemanlarının toplamını yazdırdığını görebilirsiniz ve bu

03:03.430 --> 03:06.700
programın çıktısını oluşturan şey budur.

03:06.700 --> 03:12.880
Sorum şu ki, eğer böyle bir program yazıp çalıştırırsanız bu programın çıktısı

03:12.880 --> 03:14.110
ne olacak?

03:14.590 --> 03:21.100
Dolayısıyla, bu programı gerçekten derlemeden ve çalıştırıp çıktısını görmeden önce, burada

03:21.100 --> 03:28.720
anlattığım gibi basit bir problem cümlesi yazmanızı ve bu programın olası çıktısının ne olduğunu belirlemenizi

03:28.720 --> 03:30.220
tavsiye ederim.

03:30.580 --> 03:33.130
Evet arkadaşlar, şimdi örnek kodu görelim.

03:33.130 --> 03:38.140
Dolayısıyla, aşağıdaki dizinde bulabileceğiniz örnek bir kod, thread basics slash mutex'tir.

03:38.140 --> 03:39.040
Örnek.

03:39.040 --> 03:46.360
Bu dizinde mutex example c kaynak dosyasını bulacaksınız, yani bu dosya az önce tartıştığımız problem

03:46.360 --> 03:49.240
ifadesinin aynısını uygular.

03:49.540 --> 03:55.450
Şimdi bu dosyadaki kaynak kodunu hızlıca tartışalım çünkü kaynak kodu çok basit.

03:55.570 --> 04:00.400
Yani bu dosyada yaptığım şey, öncelikle beş eleman içeren bir dizi

04:00.400 --> 04:04.510
almak ve bu işlemin bu dosyasının global bir dizisidir.

04:04.990 --> 04:05.770
Değil mi?

04:06.190 --> 04:12.910
Daha sonra ana işleve geçerseniz, ana işlevde yaptığım şey iki iş parçacığı oluşturmaktır.

04:12.910 --> 04:18.100
İlk iş parçacığı, dizinin elemanlarının toplamını sonsuz bir döngü içinde hesaplayan iş parçacığıdır.

04:18.100 --> 04:22.900
Ve ikinci iş parçacığı sadece dizinin ilk ve son öğesini değiştirir, değil mi?

04:23.080 --> 04:27.670
Yukarıda bu iki fonksiyonun uygulamasını görebilirsiniz.

04:27.670 --> 04:31.600
Bu, bir iş parçacığı oluşturduğumuz toplam iş parçacığı oluşturma işlemidir.

04:31.840 --> 04:39.040
Bu da sorumluluğu sadece dizinin ilk ve son elemanını değiştirmek olan başka bir iş parçacığı yaratan başka

04:39.040 --> 04:40.420
bir işlevdir.

04:40.690 --> 04:41.440
Değil mi?

04:41.440 --> 04:48.220
Dolayısıyla, bu geri arama işlevlerinin uygulanmasına bakarsanız, uygulamanın oldukça basit olduğunu

04:48.220 --> 04:49.660
görebilirsiniz.

04:49.690 --> 04:56.080
Basitçe dizi üzerinde yineleme yapar ve dizinin toplamını yazdırırsınız ve bunu sonsuz bir döngü içinde yapmaya devam

04:56.080 --> 04:57.490
edersiniz, değil mi?

04:57.490 --> 05:03.280
Benzer şekilde, başka bir iş parçacığında dizinin ilk ve son elemanını değiştiriyoruz.

05:03.310 --> 05:04.060
Değil mi?

05:04.060 --> 05:07.870
Ve yine, bu alıştırmayı sonsuz bir döngü içinde yapıyoruz.

05:08.200 --> 05:15.670
Şimdi bunu söyledikten sonra, artık oldukça basit olan bu programın uygulanmasının farkındasınız.

05:16.120 --> 05:23.830
Şimdi bu programı derler ve çalıştırırsanız, ortaya çıkan bariz soru, bu programın çıktısının ne

05:23.830 --> 05:24.790
olduğudur?

05:24.790 --> 05:30.040
Programın çıktısı, bu dosyada bulunan tek print of ifadesinden gelir.

05:30.040 --> 05:37.300
Bu tek print of deyimidir ve bu nedenle çıktı, dizinin elemanlarının toplamını hesaplayan iş

05:37.300 --> 05:42.070
parçacığı tarafından hesaplanan olası toplamı oluşturur.

05:42.070 --> 05:42.820
Değil mi?

05:42.820 --> 05:49.960
Yani beklenti, bu diziye göre beklenen toplamın 15 olmasıdır, değil mi?

05:50.470 --> 05:51.820
Bakalım.

05:51.850 --> 05:58.840
Şimdi bu programı derleyip çalıştıralım ve bu dizinin elemanlarının olası toplamının

05:58.840 --> 06:01.300
19 olduğunu göreceksiniz.

06:01.540 --> 06:03.340
Bir yerde saat 11.

06:03.340 --> 06:05.050
Bir yerde 15.

06:05.050 --> 06:05.740
Doğru.

06:05.740 --> 06:07.660
Ve bir yerlerde 19.

06:07.690 --> 06:08.470
Doğru.

06:08.620 --> 06:13.600
Dolayısıyla bu program, dizinin elemanlarının toplamının üç olası değerini yazdırır.

06:13.630 --> 06:16.510
1115 ve 19.

06:16.510 --> 06:17.170
Doğru.

06:18.310 --> 06:23.340
Şimdi iki farklı iş parçacığının aynı veri yapısı üzerinde hareket ettiğini anlıyorsunuz.

06:23.350 --> 06:29.980
Bu durumda, veri yapısı sizin dizinizdir, ancak program çıktısı yanlıştır, değil mi?

06:30.340 --> 06:36.880
Program, dizinin elemanlarının toplamını kimi zaman 19, kimi zaman 11 olarak yazdırıyor,

06:36.880 --> 06:39.220
oysa doğru değer 15'tir.

06:39.220 --> 06:39.910
Doğru.

06:41.030 --> 06:46.280
Slayta geri dönecek olursak, T1 iş parçacığının dizinin elemanlarının toplamını 15, 11 ve 19

06:46.280 --> 06:48.650
olarak yazdırdığını görebilirsiniz.

06:48.680 --> 06:51.050
Bu üç olası değer, değil mi?

06:51.050 --> 06:54.050
Oysa biz zaten doğru olanın 15 olduğunu biliyoruz.

06:54.410 --> 07:02.300
Yani cevap, t1 iş parçacığının neden yanlış değerler yazdırdığıdır, çünkü t1 iş parçacığı bu veri yapısı üzerinde okuma işlemi

07:02.300 --> 07:08.510
gerçekleştirirken aynı zamanda bu dizi t2 iş parçacığı tarafından değiştirilmektedir.

07:08.540 --> 07:16.190
Yani bir şekilde t1 iş parçacığı bu dizinin elemanları üzerinde toplamı hesapladığında, T1 iş parçacığı aslında

07:16.190 --> 07:19.820
bu dizinin dört olası anlık görüntüsünü görür.

07:20.270 --> 07:22.880
İlk anlık görüntü aynıdır.

07:22.880 --> 07:26.510
Bu, aslında orijinal dizi olan 12345'tir.

07:26.540 --> 07:30.500
İkinci enstantane bir, iki, üç, dört ve bir.

07:32.150 --> 07:39.380
Dolayısıyla bu anlık görüntü, T2 iş parçacığı dizi üzerinde takas işlemi gerçekleştirirken, dizinin

07:39.380 --> 07:45.860
son elemanına birinci elemanı yazdığında, ancak bu dizinin ilk elemanına henüz beşinci elemanı

07:45.860 --> 07:48.730
yazmadığında görünecektir.

07:48.740 --> 07:49.420
Değil mi?

07:49.430 --> 07:56.420
Dolayısıyla, T1 iş parçacığının dizinin ara anlık görüntüsünü gördüğü küçük bir pencere vardır.

07:56.660 --> 08:02.750
T2 iş parçacığı aslında dizinin öğelerini değiştirme sürecindeyken ancak henüz işlemini

08:02.750 --> 08:04.250
tamamlamamışken.

08:04.250 --> 08:05.030
Doğru.

08:05.270 --> 08:09.260
Yani bu dizinin elemanlarının toplamı 11 olacak, değil mi?

08:10.570 --> 08:17.050
Benzer şekilde, T1 iş parçacığının göreceği üçüncü anlık görüntü beş, iki, üç, dört ve beş olacaktır.

08:17.080 --> 08:17.770
Doğru.

08:17.770 --> 08:20.020
Nedeni de aynı.

08:20.020 --> 08:23.260
Yani bu dizinin elemanlarının toplamı 19 olacaktır.

08:24.830 --> 08:31.660
Ve T1 iş parçacığının göreceği dördüncü anlık görüntü beş, iki, üç, dört ve bir olacaktır.

08:31.670 --> 08:32.540
Değil mi?

08:32.540 --> 08:36.860
Ve bu dizinin elemanlarının toplamı hala 15'tir, doğru.

08:37.340 --> 08:44.720
Böylece, aynı dizi iş parçacığı tarafından değiştirildiği için T1 iş parçacığının aslında dizinin dört farklı anlık görüntüsünü

08:44.720 --> 08:47.000
gördüğünü görebilirsiniz.

08:47.030 --> 08:48.440
T2 Sağ.

08:48.980 --> 08:53.090
Bu nedenle toplam 11, 19 ve 15 basılmaktadır.

08:53.330 --> 08:59.690
Bir sonraki ders videosunda Mutex'leri kullanacağız ve T1 iş parçacığı dizinin elemanlarının toplamını

08:59.690 --> 09:05.660
hesaplamak için bu diziyi okurken, T2 iş parçacığının dizinin elemanlarını güncellemesine

09:05.660 --> 09:12.380
izin verilmemesini sağlayacağız ve tersine, T2 iş parçacığı dizinin ilk ve son elemanı üzerinde takas

09:12.380 --> 09:20.080
yapıyorsa, bu süre içinde T1 iş parçacığının dizinin elemanlarını okumasına izin verilmeyecektir.

09:20.090 --> 09:20.660
Değil mi?

09:20.660 --> 09:24.150
Yani temel olarak karşılıklı dışlama uygulayacağız.

09:24.150 --> 09:29.780
Yani, herhangi bir zamanda bu dizi üzerinde yalnızca bir iş parçacığı işlem yapacaktır.

09:29.790 --> 09:36.450
Dolayısıyla beklentimiz, karşılıklı dışlama iş parçacığını dağıttıktan sonra, T1'in dizinin elemanlarının

09:36.450 --> 09:40.920
toplamını 15 ve her zaman 15 olarak yazdırması olacaktır.

09:40.920 --> 09:41.670
Doğru.
