WEBVTT

00:05.270 --> 00:11.660
Şimdi bariyer ile çalışmak için ana API'yi uygulayacağız ve bu API iş parçacığı bariyeridir.

00:11.660 --> 00:17.930
Bekle, iş parçacığı bariyerleri ile ilgili işlevsellik ve teoriyi tartışırken API iş parçacığı bariyer

00:17.930 --> 00:20.000
barikatından bahsetmiştik.

00:20.030 --> 00:23.540
Bu yüzden bu API'yi iş parçacığı bariyeri olarak yeniden adlandırdık.

00:23.540 --> 00:26.600
İplik bariyeri yerine bekle barikatı bekle.

00:26.720 --> 00:29.540
Bunun nedeni gerçek olmasıdır.

00:30.260 --> 00:34.250
Posix API ile dahili olarak gelen iş parçacığı bariyeri uygulaması.

00:34.640 --> 00:37.400
Api P iplik bariyeri var mı?

00:37.400 --> 00:44.390
Bekle, uygulamamızın standart olana mümkün olduğunca yakın olması için API'mizi de yeniden

00:44.390 --> 00:45.460
adlandırdık.

00:45.470 --> 00:52.860
Bu nedenle API adı thread barrier wait, thread barrier barricade ile karşılaştırıldığında daha mantıklıdır.

00:52.880 --> 00:53.540
Doğru.

00:53.540 --> 00:55.370
Bu yüzden kafanız karışmasın.

00:56.440 --> 01:01.720
Başlangıç olarak, bu API'de uygulayacağımız algoritmayı açıklayayım.

01:01.750 --> 01:08.440
Bu algoritma hiçbir şey değildir, ancak iş parçacığı bariyerinin tüm teorisinin ve işlevselliğinin sözde

01:08.440 --> 01:11.080
kod açısından resmi bir temsilidir.

01:11.440 --> 01:16.320
Öyleyse bu algoritmada yer alan adımları ve yan yana tartışalım.

01:16.330 --> 01:19.180
Bu iplik bariyerini de uygulayacağız.

01:19.180 --> 01:20.440
Bekle, API.

01:20.470 --> 01:21.220
Doğru.

01:21.820 --> 01:26.470
Gördüğünüz gibi, bu API'nin argümanı hiçbir şey değildir, ancak yalnızca iş parçacığı bariyerine bir işaretçidir

01:26.500 --> 01:28.210
ve başka hiçbir şey değildir.

01:28.540 --> 01:34.420
Şimdi bu diyagramda yeşil kutunun yine çok iş parçacıklı bir uygulama olan uygulama

01:34.420 --> 01:42.130
kodumuzu temsil ettiğini görebilirsiniz ve birkaç iş parçacığı aynı anda bariyer noktasına çarpabilir.

01:42.760 --> 01:43.390
Doğru.

01:43.390 --> 01:49.600
Yani bu, iş parçacığı bariyerinin durumundaki güncellemelerin birbirini dışlayan bir şekilde yapılması gerektiği anlamına

01:49.600 --> 01:50.110
gelir.

01:50.110 --> 01:56.470
Bu API'de ilk adım olarak iş parçacığı bariyeri muteksini kilitlememizin nedeni de budur.

01:56.770 --> 01:57.490
Doğru.

01:57.490 --> 02:03.610
Ve bu API'deki son adım olarak, bu iş parçacığı bariyerinin muteks kilidini açacağız.

02:03.610 --> 02:04.360
Doğru.

02:04.570 --> 02:07.480
Nedeni basit ve çok anlaşılır.

02:07.510 --> 02:13.330
İş parçacığı bariyeri aynı anda birden fazla iş parçacığı tarafından güncellenecektir ve bu nedenle durumunu güncellemeden

02:13.330 --> 02:17.530
önce iş parçacığı bariyeri veri yapısını kilitlememiz gerekir.

02:18.010 --> 02:25.120
Böylece bir thread barrier dot C dosyası oluşturduğumu ve bu dosyaya thread barrier dot h başlık dosyamızı

02:25.120 --> 02:27.520
eklediğimi görebilirsiniz.

02:27.700 --> 02:28.480
Doğru.

02:28.480 --> 02:35.770
Ve hata ayıklama amacıyla kullanılabilmesi için iş parçacığı bariyeri veri yapısının bazı değişkenlerini

02:35.770 --> 02:39.910
yazdırabileceğim basit bir print işlevi yazdım.

02:39.910 --> 02:46.870
Belki de bu yazdırma işlevini kullanmayacağım ve uygulamak için tartıştığımız API bu, değil

02:46.870 --> 02:47.530
mi?

02:47.530 --> 02:50.200
Yani bunu bu API'nin ilk adımı olarak görebilirsiniz.

02:50.230 --> 02:56.980
İş parçacığı bariyeri muteksini kaydettim ve bu API'nin son adımı olarak iş parçacığı bariyeri muteksinin kilidini

02:56.980 --> 02:58.180
açacağız.

02:58.180 --> 02:58.780
Değil mi?

02:58.960 --> 03:05.260
Bu yüzden yapacağım ilk şey, iplik bariyerimizin eğilim aşamasında olup olmadığını kontrol etmek

03:05.260 --> 03:06.450
olacaktır.

03:06.460 --> 03:07.270
Doğru.

03:07.270 --> 03:14.800
Diyelim ki bu iş parçacığı bariyerinde engellenmiş T1T2T3 iş parçacığı var.

03:14.800 --> 03:20.920
Ve iş parçacığı bariyerimizin elden çıkarma aşamasında olduğunu varsayalım, yani bu iş parçacıkları

03:20.920 --> 03:28.480
bariyer noktasının ötesinde yürütmelerine devam etme sürecindedir ve iş parçacığı bariyerimizin elden çıkarma aşamasında

03:28.510 --> 03:30.490
olduğunu varsayıyoruz.

03:30.520 --> 03:36.280
Bu, henüz yürütülmeye devam edilmemiş bazı iş parçacıkları olduğu anlamına gelir.

03:36.280 --> 03:37.060
Değil mi?

03:37.060 --> 03:40.060
Bu da iplik bariyerimizin meşgul olduğu anlamına geliyor.

03:40.210 --> 03:47.120
Bu algoritmanın bir sonraki adımında yapacağım şey, bu iş parçacığı bariyerinin boolean bayrağının tekrar hazır olup olmadığını

03:47.120 --> 03:48.440
kontrol etmektir.

03:48.440 --> 03:55.970
Bu değer true değerine eşitse, iş parçacığı bariyerinin durumunu inceleyen iş parçacığının meşgul

03:55.970 --> 04:00.110
koşulunda engellenmesi gerektiği anlamına gelir.

04:00.110 --> 04:01.640
İplik bariyerinin değişkeni.

04:01.760 --> 04:02.540
Doğru.

04:03.550 --> 04:09.010
Bu yüzden basitçe bir koşul değişkeni için iş parçacığını engelleyeceğim.

04:10.260 --> 04:11.670
İşte bu kadar.

04:14.720 --> 04:15.060
Uh.

04:15.080 --> 04:15.710
Özür dilerim.

04:15.710 --> 04:19.760
Yaptığım bir hata, bunun yanlış koşula karşı kontrol edilmesi gerektiğidir.

04:19.940 --> 04:22.910
Yani tekrar hazırsa, bayrak yanlışa eşittir.

04:22.910 --> 04:29.450
Bu, iş parçacığı bariyerinin mevcut olmadığı ve senaryo buysa iş parçacığının engellenmesi gerektiği anlamına gelir.

04:29.900 --> 04:36.440
Bunu kodumuza yansıtmak için yapacağım şey, algoritmada veya akış şemasında

04:36.440 --> 04:41.510
tartıştığımız kod satırının aynısını yazmak olacaktır.

04:41.510 --> 04:44.570
Yani sadece hazır olup olmadığını kontrol ettiğimi görebilirsiniz.

04:44.570 --> 04:49.910
Yine, bayrak false'a eşitse, iş parçacığı bariyeri mevcut iş parçacığı tarafından kullanılamayacağı

04:49.910 --> 04:52.760
için mevcut iş parçacığımı engellemiş olurum.

04:52.760 --> 04:56.870
Bu API'yi şu anda kim çağırıyor?

04:56.900 --> 05:00.350
Bu koşullu kutunun gecikmemesini mi tartışıyorsunuz?

05:00.350 --> 05:03.170
İplik bariyeri meşgul değilse ne olur?

05:03.170 --> 05:09.440
Bu durumda, mevcut iş parçacığının bariyer noktasına ulaşıp ulaşmadığı senaryosunu ele

05:09.440 --> 05:10.400
alacağım.

05:12.850 --> 05:15.010
Son konu mu değil mi?

05:15.310 --> 05:16.090
Doğru.

05:18.110 --> 05:20.380
Yani mevcut konu son konu olacaktır.

05:20.390 --> 05:25.190
Bariyer mevcut ağırlık sayısı artı bir, bariyer eşiğine eşitse.

05:25.670 --> 05:26.480
Doğru.

05:27.320 --> 05:32.780
Yani bu durumda, bariyer noktasına ulaşan mevcut iş parçacığı son iş parçacığı ise.

05:33.460 --> 05:38.650
Ardından bariyer durumunu, bariyerin eğilim aşamasında olduğunu yansıtacak şekilde güncellerim.

05:38.680 --> 05:42.820
Bu, boolean bayrağının tekrar hazır olduğunu basitçe güncelleyeceğim anlamına gelir.

05:42.820 --> 05:45.010
Yanlışa eşit, değil mi?

05:45.640 --> 05:51.970
Nedeni basit, şimdi bariyerim üzerinde engellenmiş olan tüm iş parçacıklarını serbest bırakmalı.

05:52.120 --> 05:58.330
Dolayısıyla, bir sonraki adım olarak, bu son iş parçacığı basitçe bir sinyal üretmelidir.

05:58.360 --> 06:04.930
Bu sinyal, bu bariyerde engellenen başka bir iş parçacığı tarafından tüketilecektir ve mevcut iş parçacığım bariyer

06:04.930 --> 06:08.230
muteksinin kilidini açarak basitçe çıkmalıdır.

06:08.530 --> 06:09.310
Doğru.

06:09.760 --> 06:15.490
Yani bu, bariyer noktasına henüz ulaşmış bir iş parçacığının son iş parçacığı olduğu senaryodur.

06:16.030 --> 06:21.460
Örneğin, bariyerimizin eşik sayısının üç olduğunu ve bu iş parçacığı bariyerinde zaten engellenmiş

06:21.460 --> 06:24.580
t bir iş parçacığı t iki olduğunu varsayalım.

06:24.580 --> 06:28.180
Ve t üç ipliğinin bariyer noktasına çarptığını varsayalım.

06:28.180 --> 06:31.180
İşte az önce ele aldığımız senaryo budur.

06:31.960 --> 06:38.240
Bunu koda yansıtmak için, mevcut ağırlık sayısı artı bir bariyer eşik sayısına

06:38.240 --> 06:45.140
eşitse, bu yürütmenin bağlamında yapıldığı mevcut iş parçacığının bariyer noktasına

06:45.140 --> 06:51.470
ulaşan son iş parçacığı olduğu anlamına gelir ve bu durumda sadece bir sinyal üretir

06:51.470 --> 06:55.640
ve muteksin kilidini açar ve çıkarım.

06:55.910 --> 06:56.660
Doğru.

06:57.320 --> 06:59.090
Ayar tekrar hazır.

06:59.090 --> 07:05.510
Boolean bayrağının false değerini alması, iş parçacığı bariyerimizin eğilim ilerleme aşamasında olduğunu gösterir.

07:06.480 --> 07:09.450
Şimdi bu koşullu kutunun gecikme olmamasını ele alalım.

07:09.450 --> 07:14.730
Ya bariyer noktasına henüz ulaşmış olan konu son konu değilse?

07:14.760 --> 07:15.450
Doğru.

07:15.450 --> 07:23.910
Bu diyagramda, bariyer noktasına henüz ulaşan bir T2 iş parçacığımız olduğunu ve bu iş parçacığı bariyerinin eşik sayısı değerinin

07:23.910 --> 07:31.290
üç olduğunu ve T1 iş parçacığının bu iş parçacığı bariyerinde zaten engellendiğini varsayalım.

07:31.290 --> 07:32.010
Doğru.

07:32.010 --> 07:37.950
Dolayısıyla bu, bu koşullu kutunun gecikme yok kısmına girecek olan senaryo olacaktır.

07:38.370 --> 07:43.800
Şimdi bu durumda, iş parçacığı bariyerinde engellenecek olan T2 iş parçacığımız var.

07:43.800 --> 07:50.760
Bu durumda, iş parçacığı bariyerinde kaç iş parçacığının engellendiğini takip eden

07:50.760 --> 07:54.480
bir sayacı artıracağız, bu kadar basit.

07:54.480 --> 08:00.000
Ve yapmamız gereken bir sonraki şey, bu T2 iş parçacığını bariyer noktasında bloke etmektir.

08:00.030 --> 08:06.460
Bu yüzden bir API iş parçacığı koşulu çağıracağız, bekleyeceğiz ve bu yeni gelen iş parçacığını bariyer koşulu

08:06.490 --> 08:08.410
değişkeninde engelleyeceğiz.

08:09.280 --> 08:15.790
Bunu koda yansıtmak için, aynı komutları yazdığımı görebilirsiniz.

08:16.470 --> 08:21.460
Mevcut ağırlık sayısı değişkeni ve bariyer koşulu değişkeninde mevcut iş parçacığını engelleyin.

08:21.480 --> 08:22.140
Doğru.

08:23.420 --> 08:31.280
Şimdi bu iş parçacığı bariyerinde engellenmiş bir T1 ve t2 iş parçacığımız var ve şimdi bu engellenmiş iş parçacıklarından herhangi

08:31.280 --> 08:34.960
birinin bir sinyal alacağı bir durumu ele almamız gerekiyor.

08:34.970 --> 08:35.780
Doğru.

08:35.960 --> 08:42.560
Dolayısıyla, bu algoritmada bu kutunun ötesindeki kod yalnızca engellenen iş parçacığı bir sinyal aldığında çalışacaktır.

08:43.580 --> 08:49.040
Bu da bariyer noktasında engellenen iş parçacıklarından birinin bir sinyal aldığı anlamına gelir.

08:49.040 --> 08:55.460
Yani, örneğin, T2 iş parçacığının bir sinyal aldığını ve yürütmeye devam ettiğini varsayalım.

08:55.970 --> 09:01.700
Yani yapmamız gereken ilk şey sayaç değerini azaltmak, değil mi?

09:01.700 --> 09:05.240
Çünkü iş parçacıklarından biri artık yürütülmeye başlamıştır.

09:05.240 --> 09:11.510
Böylece bariyer noktasında engellenen toplam iş parçacığı sayısı bir azalacaktır.

09:12.080 --> 09:20.150
Şimdi bariyer noktasını terk eden iş parçacığının son iş parçacığı olup olmadığı senaryosunu ele almamız gerekiyor.

09:20.180 --> 09:24.230
Son iş parçacığı değilse, o iş parçacığı bir sinyal üretmelidir.

09:24.230 --> 09:28.670
Eğer son iş parçacığı ise, o zaman söz konusu iş parçacığı bir sinyal üretmemelidir.

09:28.700 --> 09:29.300
Doğru.

09:29.540 --> 09:34.250
Dolayısıyla, bu değişkeni kontrol ederek bunu kolayca kontrol edebilirsiniz.

09:34.700 --> 09:41.060
Mevcut hız sayısı sıfıra eşitse, bu, bariyer noktasını terk eden iş parçacığının bariyer noktasını terk

09:41.090 --> 09:44.220
eden son iş parçacığı olmadığı anlamına gelir.

09:44.250 --> 09:50.430
Bu durumda T2 iş parçacığı, bu bariyer noktasında engellenmiş olan başka bir iş parçacığı için bir sinyal

09:50.430 --> 09:51.540
üretecektir.

09:51.660 --> 09:52.490
Doğru.

09:52.500 --> 09:57.810
Böylece T2 olan mevcut iş parçacığının basitçe bir sinyal üreteceğini görebilirsiniz.

09:57.810 --> 10:01.500
Muteksin kilidini açın ve bu doğru şekilde yapılır.

10:02.200 --> 10:06.090
Ama şimdi bu koşullu kutunun evet gecikmesini ele alalım.

10:06.100 --> 10:13.510
Bariyer noktasını terk eden iş parçacığı son iş parçacığıysa, bu durumda bu iş parçacığı bariyerinin elden

10:13.510 --> 10:17.350
çıkarma aşamasını şu şekilde işaretlememiz gerekir.

10:18.180 --> 10:18.970
Bitti.

10:18.990 --> 10:26.700
Yani bu, tekrar hazır boolean değişkenini true olarak işaretleyeceğimiz ve bu iş parçacığının sadece meşgul koşul değişkenini

10:26.700 --> 10:31.950
veya iş parçacığı bariyerini yayınlaması gerektiği anlamına gelir.

10:31.980 --> 10:38.820
Çünkü iş parçacığı bariyerinin yerleştirme aşaması devam ederken, çok sayıda iş parçacığı olabilir.

10:38.860 --> 10:45.180
Diyelim ki T 4 ila 5 t altı meşgul koşul değişkeninde bloke edildi.

10:45.810 --> 10:46.510
Doğru.

10:46.680 --> 10:52.170
Uygulamamızın çok iş parçacıklı olduğu varsayıldığından, iş parçacığı bariyerine erişmek için herhangi bir sayıda iş parçacığı

10:52.170 --> 10:53.160
gelebilir.

10:53.400 --> 10:59.670
Dolayısıyla, son iş parçacığı bariyer noktasından ayrıldığında, meşgul koşul değişkeninde engellenen tüm iş parçacıklarına

10:59.700 --> 11:04.530
bir iş parçacığı bariyerinin meşgul olduğunu söylemek son iş parçacığının sorumluluğundadır.

11:04.530 --> 11:05.790
Git ve eriş.

11:05.790 --> 11:06.570
Doğru.

11:08.930 --> 11:14.660
Ve bundan sonra son iş parçacığı sadece muteksin kilidini açar ve son iş parçacığının da işi biter.

11:15.380 --> 11:20.120
Bunu koda yansıtmak için fazladan bir şey yapmadığımı görebilirsiniz.

11:20.150 --> 11:24.580
Algoritmada tartıştığımız kod parçasının aynısını yazıyorum.

11:24.590 --> 11:29.840
Burada her iki senaryoyu da ele aldığımı görebilirsiniz.

11:30.530 --> 11:36.890
Bu, bariyer noktasını terk eden ipliğin son iplik olduğu durumdur ve diğer kısım

11:36.890 --> 11:39.230
bunu kapsayan durumdur.

11:39.230 --> 11:42.800
Bariyer noktasını terk eden iplik son iplik değildir.

11:43.220 --> 11:51.110
Burada bahsetmeyi unuttuğum bir şey var, bunu kullanmak yerine while kullanmamız gerekiyorsa, bunu zaten prequel kursunda

11:51.110 --> 11:56.810
oldukça ayrıntılı bir şekilde tartıştık çünkü bu while döngüsü sahte uyanmaları önlemek

11:56.810 --> 11:58.670
için kullanılıyor.

11:58.970 --> 11:59.780
Doğru.

12:01.250 --> 12:04.760
Böylece iplik bariyeri işlevselliğini ele almış olduk.

12:05.630 --> 12:11.060
Bu akış şemasını tekrar gözden geçirmenizi, iplik bariyerlerinin işlevselliğini yansıtması için işlerin

12:11.060 --> 12:14.600
nasıl bir araya getirildiğini anlamaya çalışmanızı öneririm.

12:15.950 --> 12:21.710
Bir sonraki ders videosunda, iş parçacığı bariyerlerinin kullanımını gösteren kısa bir demo program yazacağız.
