WEBVTT

00:05.170 --> 00:11.050
Şimdi arkadaşlar, bir önceki ders videosunda tüketici iş parçacığı için nasıl bir sözde kod yazacağımızı ve üretici

00:11.050 --> 00:17.560
iş parçacığı için nasıl bir sözde kod yazacağımızı öğrendik, böylece hem tüketici hem de üretici ağırlık ve sinyal API'lerini

00:17.560 --> 00:21.040
kullanarak birbirleriyle koordine olabilirler.

00:21.280 --> 00:22.120
Doğru.

00:24.590 --> 00:31.580
Tüketici tarafında S1, S2, S3, S4, S5 adım numaralarını ve üretici tarafında S6, S7, S8, S9

00:31.610 --> 00:38.900
adımlarını tartıştık ve ayrıca bu adımların her birinin tüketici ve üretici tarafındaki uygunluğunu

00:38.900 --> 00:40.760
tartıştık.

00:41.120 --> 00:47.300
Ancak yine de, üretici ve tüketici iş parçacığı arasındaki koordinasyonu temsil eden bu

00:47.300 --> 00:50.780
iki sözde kod parçasında hala bir boşluk vardır.

00:50.810 --> 00:58.340
Bu ders videosunda, boşluğun ne olduğunu ve bu boşluğun nasıl onarılabileceğini tartışacağız.

00:58.520 --> 01:05.390
Hatırlayın, öncelikli hedeflerimizden biri tüketici iş parçacığının kuyruğu boş bulduğunda kendini

01:05.630 --> 01:07.250
bloke etmesiydi.

01:07.250 --> 01:07.970
Değil mi?

01:07.970 --> 01:16.520
Bu nedenle tüketici iş parçacığı S4 adımını yalnızca kuyruğun boş olmadığı garanti edildiğinde yürütmelidir.

01:16.520 --> 01:17.250
Doğru.

01:17.270 --> 01:24.540
Eğer bir şekilde tüketici iş parçacığımız boş bir kuyrukta S4 numaralı adımı yürütürse, o zaman programın bu

01:24.540 --> 01:28.560
belirli durumunu sorunlu durum olarak değerlendiririz.

01:28.560 --> 01:29.340
Doğru.

01:30.060 --> 01:36.060
Şimdi bu ders videosunda, size üretici ve tüketici iş parçacığının bu sözde kodları

01:36.060 --> 01:44.250
ile tüketici iş parçacığınız T1'in boş bir kuyrukta S4 adım numarasını nasıl yürütebileceğini göstereceğim.

01:45.570 --> 01:51.780
Başlangıç olarak, diyelim ki programımızda veya sürecimizde iki tüketici iş parçacığımız var.

01:51.930 --> 01:54.570
T1 ipliği ve T3 ipliği.

01:54.570 --> 01:55.290
Doğru.

01:55.320 --> 01:59.190
Programınızda herhangi bir sayıda üretici ve tüketici iş parçacığı olabilir.

01:59.190 --> 02:05.070
Boşluğu açıklamak için iki tüketici ipliği olduğunu düşünelim, değil mi?

02:05.990 --> 02:08.600
Ve tabii ki bir tane de üretici ipliği var.

02:10.950 --> 02:16.290
Şimdi tüketici iş parçacığının bu kuyruktan bir veri öğesi tüketmek istediğini varsayalım.

02:16.320 --> 02:19.920
Bu nedenle, tüketici iş parçacığı S1 adım numarasını yürütür.

02:19.950 --> 02:21.930
Kuyruğu boş bulur.

02:22.140 --> 02:27.900
Bu nedenle, tüketici iş parçacığı t1, S3 sağ adım numarasında bloke olur.

02:28.440 --> 02:35.280
Dolayısıyla, tüketici iş parçacığı sözde kodunu T1 iş parçacığı bağlamında tartışıyoruz

02:35.310 --> 02:38.880
ve S3 adımında engellenen T1 iş parçacığıdır.

02:38.910 --> 02:39.780
Doğru.

02:41.830 --> 02:45.820
Şimdi T1 iş parçacığı S3 adımında engellendiği için.

02:45.850 --> 02:53.680
Şimdi, üretici iş parçacığınızın CPU'yu doğru bir şekilde aldığını ve altıncı adımı yürütmeye başladığını ve kuyruğun

02:53.920 --> 02:58.900
kapasitesine kadar dolu olmadığını tespit ettiğini varsayalım.

02:58.930 --> 03:05.080
Bu nedenle bir veri elemanı üretir ve veri elemanını ürettikten sonra bu elemanı bu kuyruğa

03:05.080 --> 03:06.160
yerleştirir.

03:06.370 --> 03:07.090
Doğru.

03:07.090 --> 03:14.110
Bu kutuyu üretici iş parçacığı tarafından kuyrukta bulunan bir veri öğesi olarak temsil edelim ve daha sonra üretici

03:14.110 --> 03:22.240
iş parçacığı sekiz numaralı adımı gerçekleştirir ve bu nedenle zaten engellenmiş olan T1 iş parçacığına bir sinyal gönderilir.

03:22.270 --> 03:23.050
Doğru.

03:23.080 --> 03:32.350
Şimdi bu sinyal gönderilir gönderilmez, t1 iş parçacığı engellenmiş durumdan yürütmeye hazır duruma geçer.

03:33.320 --> 03:40.690
Doğru, ancak T1 iş parçacığı, üretici iş parçacığı muteksi serbest bırakana kadar çalışmayacaktır.

03:40.700 --> 03:47.750
Diyelim ki T2 iş parçacığı S9 adım numarasını doğru şekilde uygulayarak muteksi serbest bıraktı.

03:49.500 --> 03:51.050
Şimdi, işin püf noktası şu.

03:51.060 --> 03:57.350
T2 üretici iş parçacığı S9 adım numarasının yürütülmesini bitirir bitirmez.

03:57.390 --> 04:04.800
Şimdi, işlemde yürütmek için CPU tahsis edilebilecek t1 iş parçacığı ve T3 iş parçacığı olmak üzere iki iş

04:04.800 --> 04:06.510
parçacığı daha vardır.

04:06.540 --> 04:07.260
Doğru.

04:07.290 --> 04:11.430
T1 ve T3 iş parçacıklarının her ikisi de CPU tarafından yürütülebilir.

04:11.460 --> 04:12.210
Doğru.

04:12.240 --> 04:18.330
Şimdi sorun, CPU'nun t1 iş parçacığı yerine t3 iş parçacığını kullanması durumunda ortaya çıkacaktır.

04:18.330 --> 04:19.080
Doğru.

04:19.110 --> 04:26.610
Bakın, çekirdek zamanlama politikası veya iş parçacığı zamanlama politikası uyarınca CPU tarafından hangi iş parçacığının zamanlanacağı

04:26.610 --> 04:28.760
üzerinde bir kontrolünüz yoktur.

04:28.770 --> 04:33.990
İşletim sisteminiz CPU üzerinde yürütülecek iş parçacıklarından herhangi birini seçebilir.

04:33.990 --> 04:34.680
Doğru.

04:34.680 --> 04:39.300
Ve bu durumda hem T1 hem de T3 iş parçacıkları yürütülmeye hazırdır.

04:39.300 --> 04:40.020
Değil mi?

04:41.040 --> 04:46.620
Şimdi çekirdeğinizin veya işletim sisteminizin çalıştırmak için D3 iş parçacığını seçtiğini varsayalım.

04:46.620 --> 04:47.370
Değil mi?

04:47.370 --> 04:54.540
Ve D3 iş parçacığının bir tüketici iş parçacığı olduğunu zaten biliyoruz, bu nedenle şimdilik adım numarasının dokuz

04:54.580 --> 04:56.310
olduğu anlamına geliyor.

04:56.310 --> 05:04.320
S 94, bunun s dokuz adım numarasından sonra, ancak adım numarasından önce yürütülen bir adım olduğu anlamına gelir.

05:04.320 --> 05:05.280
S 4.

05:05.280 --> 05:06.120
Doğru.

05:08.360 --> 05:15.110
Diyelim ki programınızın bu noktasında, sürecin üçte üçü olan başka bir tüketici

05:15.110 --> 05:18.830
iş parçacığı kuyruğu tekrar boşaltıyor.

05:18.860 --> 05:19.540
Doğru.

05:19.550 --> 05:25.340
Unutmayın, kuyrukta bir öğe vardır ve kuyruğun bu belirli öğesini tüketen

05:25.340 --> 05:31.370
tüketici iş parçacığı üç üçtür ve kuyruk tekrar boş duruma getirilir.

05:32.640 --> 05:39.480
İş parçacığı üçün, iş parçacığı T2 dokuz numaralı adımı tamamladığında ve iş parçacığı T1'e CPU tahsis edilmediğinde

05:39.480 --> 05:47.040
bu eylemi gerçekleştirdiğini hatırlayın, yani iş parçacığı t1'e herhangi bir zamanda CPU tahsis edilebilir.

05:47.040 --> 05:54.270
Ancak, işletim sisteminiz t1 iş parçacığı yerine başka bir T3 iş parçacığını yürütmek için seçti,

05:54.270 --> 06:02.940
bu nedenle T1 iş parçacığı henüz S4 adım numarasını yürütmedi, bu nedenle şimdi T3 iş parçacığı s 94 adım numarasını gerçekleştirdikten

06:02.940 --> 06:05.160
sonra.

06:05.370 --> 06:13.620
Şimdi T1 iş parçacığının CPU'yu aldığını ve S4 Doğru adımını yürüttüğünü varsayalım.

06:13.620 --> 06:21.270
Şimdi T1 tüketici iş parçacığımızın boş bir kuyruğu tükettiğini görebilirsiniz, bu da sorun bildirimimize veya

06:21.270 --> 06:24.180
hedefimize göre istenmeyen bir durumdur.

06:25.080 --> 06:33.280
T1 iş parçacığımız, varsayımımıza göre problemin durumu olan boş bir kuyrukta S4 adım numarasını yürütmekle

06:33.280 --> 06:34.750
sonuçlanır.

06:34.750 --> 06:35.530
Doğru.

06:36.100 --> 06:42.610
Şimdi tüketici iş parçacığının boş bir kuyrukta S4 numaralı adımı engellediği bir çözüm düşünmemiz ya

06:42.610 --> 06:44.470
da uygulamamız gerekiyor.

06:44.920 --> 06:52.330
Dolayısıyla bu sorun, tüketici iş parçacığının sözde kodunda yapabileceğiniz çok küçük kod değişiklikleriyle basitçe

06:52.360 --> 06:53.650
çözülebilir.

06:53.920 --> 06:56.910
Çözüm çok basit ve anlaşılırdır.

06:56.920 --> 07:05.020
Sinyali aldıktan sonra uyanan tüketici iş parçacığı, kuyruğu gerçekten işlemeden önce yüklem koşulunu tekrar

07:05.020 --> 07:06.970
kontrol etmelidir.

07:06.970 --> 07:07.810
Doğru.

07:08.020 --> 07:14.350
Yani bu basitçe, tüketici iş parçacığı bu sinyali aldığında ve tüketici iş parçacığı gerçekten çalışmaya başladığında,

07:14.350 --> 07:21.010
adım numarasını gerçekleştirmek için bu yüklem koşulunu tekrar kontrol etmesi gerektiği anlamına gelir.

07:21.010 --> 07:29.320
S4 Yani burada yapabileceğiniz basit bir küçük kod değişikliği, if koşulu yerine while koşulu

07:29.320 --> 07:34.660
yazmanız gerektiği anlamına gelir ve hepsi bu kadar.

07:35.820 --> 07:42.150
Tüketici iş parçacığı engellenmiş durumdan yürütmeye her başladığında, yüklem koşulunu tekrar kontrol

07:42.150 --> 07:43.290
edecektir.

07:43.290 --> 07:50.580
Ve eğer t1 iş parçacığı işlem yapmadan önce başka bir tüketici iş parçacığı kuyruk üzerinde işlem yaptığı için kuyruğu

07:50.580 --> 07:56.900
boş bulursa, o zaman T1 iş parçacığı koşul değişkeni üzerinde tekrar bloke olur, bu da basitçe t1 iş

07:56.910 --> 08:03.160
parçacığının boş bir kuyruk üzerinde asla dört adımını uygulayamayacağı anlamına gelir.

08:03.180 --> 08:07.530
Şimdi tüketici iş parçacığı sözde kodunda S2 numaralı adımda.

08:07.560 --> 08:13.440
Bu if'i while deyimiyle değiştirirseniz, tüketici iş parçacığı için mükemmel bir sözde kod olur ve koşul

08:13.440 --> 08:19.110
değişkeni üzerinde iki iş parçacığını senkronize etmeniz gereken tüm çok iş parçacıklı programlarda,

08:19.110 --> 08:24.240
üretici ve tüketici iş parçacığı için tam olarak aynı sözde kodu yazmanız gerekir.

08:24.270 --> 08:25.020
Değil mi?

08:25.140 --> 08:31.770
Şimdi bir sonraki slaytta ilerlerken, bunun tüketici iş parçacığı için mükemmel bir sözde kod olduğunu görebilirsiniz.

08:31.770 --> 08:35.520
Sağ tarafta ise üretici iş parçacığı için mükemmel bir sözde kod bulunmaktadır.

08:35.520 --> 08:36.180
Değil mi?

08:36.180 --> 08:40.590
Dolayısıyla bunlar, uygulamanın sorun bildirimine göre genel sözde kodlardır.

08:40.620 --> 08:45.780
Elbette burada bir yüklemi temsil eden bir fonksiyon yazmanız gerekiyor, değil mi?

08:46.830 --> 08:54.000
Ve burada, uyandırma sırasında kritik bölümün yürütülmesini temsil eden uygulamaya özel bir çalışma gerçekleştirmeniz gerekir.

08:54.240 --> 08:54.930
Değil mi?

08:54.930 --> 09:01.140
Dolayısıyla bu işlev, tüketici iş parçacığınız uyandığında yürütülecek uygulamanızın kritik bölümünü

09:01.140 --> 09:02.250
temsil eder.

09:02.700 --> 09:08.820
Yani bu genel sözde koddur ve iş parçacığı senkronizasyon problemini ve çözümünü kodlarken aynı modeli

09:08.820 --> 09:09.720
takip edin.

09:09.930 --> 09:16.860
Bu, tutarlı ve somut olan üretici ve tüketici iş parçacıkları arasındaki senkronizasyon türüdür.

09:16.890 --> 09:22.950
Çoğu iş parçacığı senkronizasyon problemi standart üretici ve tüketici problemlerine ayrıştırılabilir.

09:22.950 --> 09:23.670
Doğru.

09:23.700 --> 09:30.210
Gelişmiş iş parçacığı senkronizasyonu yazarken, bu sözde kodları tekrar tekrar yazacağınızı

09:30.210 --> 09:32.460
fark edeceksiniz.

09:32.580 --> 09:39.450
Çünkü çoğu iş parçacığı senkronizasyon problemi günün sonunda minimum boyutta üretici tüketici

09:39.450 --> 09:42.240
problemlerine ayrıştırılabilir.

09:42.240 --> 09:47.760
Dolayısıyla, iki iş parçacığını senkronize etmeniz gerektiğinde ve bu iki iş parçacığı aslında

09:47.760 --> 09:54.180
aynı kaynak için rekabet ediyorsa ve iş parçacıkları üretici tüketici iş parçacıkları olarak sınıflandırılabilecek

09:54.180 --> 10:00.960
nitelikteyse, aklınızda ikinci bir düşünce olmadan, bu iki sözde kodu kullanarak iki iş parçacığını senkronize etmeyi

10:00.960 --> 10:03.390
düşünmelisiniz.

10:03.390 --> 10:04.110
Değil mi?
