WEBVTT

00:04.970 --> 00:10.850
Bu yüzden bu Merhaba Dünya programında, dosyada olduğumu görebilmeniz için temel bir çok iş parçacıklı programın nasıl oluşturulacağını

00:10.850 --> 00:12.020
göstereceğim.

00:12.020 --> 00:14.060
Merhaba, dünya nokta C, değil mi?

00:14.570 --> 00:20.960
Ve C'de çok iş parçacıklı bir program yazmak için, pthreads olan bu başlık dosyasını dahil etmeniz

00:20.960 --> 00:21.790
gerekir.

00:22.340 --> 00:22.970
Doğru.

00:22.970 --> 00:28.460
Bu nedenle, Posix iş parçacıklarıyla çalışmanız gerektiğinde dahil etmeniz gereken bir başlık dosyasıdır.

00:28.760 --> 00:31.550
Öyleyse çok iş parçacıklı programımızı yazmaya başlayalım.

00:31.550 --> 00:37.760
Eğer şu anda bu Merhaba Dünya programının bir çalıştırılabilir dosyasını oluşturursanız ve programı basitçe

00:37.760 --> 00:43.580
çalıştırırsanız, ana iş parçacığı adı verilen bir iş parçacığı oluşturacak ve bu ana iş parçacığı main fonksiyonunu

00:43.580 --> 00:45.530
çalıştıracaktır.

00:45.530 --> 00:52.190
Bir önceki ders videosunda da söylediğim gibi, her uygulamanın en az bir iş parçacığı vardır ve buna ana iş parçacığı

00:52.190 --> 00:53.150
denir.

00:53.180 --> 01:00.290
Şimdi bu çok iş parçacıklı programı geliştirelim ve ana iş parçacığının nasıl daha fazla iş parçacığı oluşturabileceğini

01:00.290 --> 01:01.100
görelim.

01:02.380 --> 01:06.240
Öyleyse geliştirmemize elbette ana fonksiyondan başlayalım.

01:06.250 --> 01:11.320
Bu yüzden yapacağım şey, ana fonksiyondan yeni bir iş parçacığı oluşturmak olacak.

01:11.320 --> 01:16.570
Bu yüzden yeni bir iş parçacığı oluşturmak için Thread one Create adında kullanıcı tanımlı bir fonksiyon

01:16.570 --> 01:17.230
yazacağım.

01:17.230 --> 01:23.230
Kısaca size bu fonksiyonun uygulamasını göstereceğim ve ana iş parçacığı olduğu için oluşturacağı

01:23.230 --> 01:26.920
yeni iş parçacığının ana iş parçacığı olacak.

01:26.950 --> 01:32.770
Şimdi bir noktayı hatırlayın, eğer ana iş parçacığı sonlanırsa, ana iş parçacığının oluşturduğu

01:32.770 --> 01:35.380
tüm alt iş parçacıkları da sonlanır.

01:35.380 --> 01:35.920
Doğru.

01:35.920 --> 01:39.730
Bu yüzden ana iş parçacığının sonlandırılmamasını isteriz.

01:39.730 --> 01:40.240
Doğru.

01:40.240 --> 01:44.110
Ana iş parçacığınız sonlandırılırsa, tüm uygulamanız sonlandırılır.

01:44.110 --> 01:44.710
Doğru.

01:44.710 --> 01:52.090
Dolayısıyla, uygulamanızın oluşturduğu alt iş parçacıkları ne olursa olsun, tüm bu alt iş parçacıkları da sonlandırılacaktır.

01:52.090 --> 01:52.600
Değil mi?

01:52.600 --> 01:55.900
Bu yüzden ana iş parçacığımızın sonlanmasını istemeyiz.

01:55.900 --> 02:02.060
Bu nedenle, bu duraklatma işlevini kullanabilmek için başlık dosyası hash include

02:02.060 --> 02:07.640
unistd'yi dahil etmeniz gerekir. h.

02:09.650 --> 02:15.610
Bu programı çalıştırdığınızda, ana fonksiyonunuz bu duraklama satırında duracaktır, değil mi?

02:15.620 --> 02:17.480
Feshedilmeyecektir.

02:19.480 --> 02:23.040
Şimdi Thread one Create fonksiyonunun uygulanmasını tartışalım.

02:23.050 --> 02:26.640
Bu fonksiyonda bir alt iş parçacığı oluşturacağız.

02:26.650 --> 02:31.510
Evet arkadaşlar, şimdi thread one Create fonksiyonumuzun uygulamasına başlayalım.

02:31.660 --> 02:37.000
Başlangıç olarak, bu fonksiyonda yeni bir iş parçacığı oluşturmam gerektiğini zaten biliyoruz.

02:37.000 --> 02:37.720
Değil mi?

02:37.900 --> 02:45.880
Yani her iş parçacığı, p iş parçacığı alt çizgisi T olarak adlandırılan bir veri yapısı ile tanımlanır, doğru.

02:45.880 --> 02:51.040
Yani p thread dot h başlık dosyasında tanımlanan dahili bir veri yapısıdır.

02:51.040 --> 02:57.850
Son programcı veya geliştirici olarak, bu veri yapısının iç tanımı hakkında endişelenmenize gerek yok,

02:57.850 --> 03:03.310
yani bu veri yapılarının diğer üyeleri hakkında endişelenmenize gerek yok, değil

03:03.310 --> 03:03.910
mi?

03:03.910 --> 03:08.200
Bu veri yapısı bir programcı veya geliştirici için opaktır.

03:08.200 --> 03:14.260
Opak dediğimde, basitçe bir geliştirici olarak bu veri yapısının diğer dahili üyelerinin ne olduğunu asla bilmeniz gerekmediği

03:14.260 --> 03:16.180
anlamına geliyor, değil mi?

03:16.180 --> 03:22.910
Dolayısıyla, iş parçacıklarıyla çalışmak için kullanıcılara veya geliştiriciye açık olan opak bir veri yapısıdır.

03:23.300 --> 03:29.090
Dolayısıyla, bu P iş parçacığı alt çizgisi T halk arasında iş parçacığı tanıtıcısı olarak da adlandırılır.

03:29.090 --> 03:29.750
Doğru.

03:31.040 --> 03:37.940
Dolayısıyla, yeni bir iş parçacığı oluşturmamız gerektiğinden, söz konusu iş parçacığını tanımlayabileceğimiz bir iş parçacığı tanıtıcısına ihtiyacımız

03:37.940 --> 03:38.550
vardır.

03:38.570 --> 03:39.190
Doğru.

03:39.200 --> 03:45.830
Başka bir deyişle, bu iş parçacığı tanıtıcısı tarafından temsil edilen yeni iş parçacığı üzerinde işlem yapmanız

03:45.830 --> 03:51.200
gerektiğinde programınızda kullanabileceğiniz bir değişken olarak düşünebilirsiniz.

03:51.230 --> 03:51.890
Değil mi?

03:52.160 --> 03:59.870
Şimdi, bu iş parçacığı tanıtıcısını oluşturduktan sonra, oluşturacağımız iş parçacığına girdi olarak hizmet

03:59.870 --> 04:02.000
edecek bazı girdiler alalım.

04:02.000 --> 04:02.660
Doğru.

04:02.690 --> 04:09.290
Yani yeni bir alt iş parçacığı oluşturacaksınız ve iş parçacığının bazı işler yapması gerekiyor ve bazı işleri

04:09.290 --> 04:12.710
yapmak için bazı girdilere ihtiyacınız var, değil mi?

04:13.370 --> 04:18.260
Tıpkı bazı işleri yapan fonksiyonlarınız olduğu ve fonksiyonların girdiye ihtiyaç duyduğu gibi.

04:18.290 --> 04:21.860
Benzer şekilde, ipliklerin de girdiye ihtiyacı vardır.

04:23.020 --> 04:23.710
Evet.

04:24.040 --> 04:29.830
Bir Merhaba Dünya programı yazdığımıza göre, bir dizeden başka bir şey olmayan çok basit bir

04:29.830 --> 04:30.910
girdi alalım.

04:30.910 --> 04:31.480
Değil mi?

04:31.480 --> 04:36.070
Ve bu dize basitçe benim bu programda bir numaralı konu olduğumu söylüyor.

04:36.070 --> 04:38.770
Sadece bir çocuk iş parçacığı oluşturacağız.

04:39.040 --> 04:44.980
Şimdi, oluşturacağımız alt iş parçacığına sağlanması gereken bir girdi verisi

04:44.980 --> 04:45.970
aldık.

04:46.270 --> 04:49.100
Yeni iş parçacığı API kullanılarak oluşturulur.

04:49.150 --> 04:51.280
P iplik alt çizgi oluşturun.

04:51.310 --> 04:56.830
Şimdi bu, Posix iş parçacığı kütüphanemiz tarafından sağlanan dahili bir API'dir.

04:56.860 --> 04:57.700
Değil mi?

04:57.880 --> 05:02.770
Böylece p thread underscore create API kullanılarak yeni iş parçacığı oluşturulur.

05:02.800 --> 05:07.900
Şimdi, bu API'ye aktardığımız argümanı tartışalım.

05:07.930 --> 05:11.800
Bu API'nin ilk argümanı iş parçacığı tanıtıcısından başka bir şey değildir.

05:11.830 --> 05:12.520
Doğru.

05:12.520 --> 05:15.430
Bu yüzden iş parçacığı tanıtıcısının adresini aktarmanız gerekir.

05:16.220 --> 05:18.920
İkinci argümanı daha sonra tartışacağız.

05:18.920 --> 05:21.560
Şimdilik, bunu null olarak geçirebilirsiniz.

05:21.590 --> 05:24.800
Üçüncü bağımsız değişken fonksiyona bir işaretçidir.

05:24.800 --> 05:31.850
Bunu kısaca tartışacaktık ve dördüncü argüman, yeni iş parçacığımıza girdi olarak sağlamamız gereken

05:31.850 --> 05:35.610
bir veri veya giriş verisinden başka bir şey değildir.

05:35.630 --> 05:42.080
Dolayısıyla dördüncü argümanda belleğin adresini geçmeniz gerekir ve bu bellek yeni iş parçacığı tarafından bir

05:42.080 --> 05:44.090
girdi olarak kullanılacaktır.

05:44.090 --> 05:44.780
Doğru.

05:45.200 --> 05:51.080
Bu nedenle, yeni iş parçacığına girdi olarak sağlanan belleğin heap üzerindeki bellek veya statik

05:51.080 --> 05:54.410
bellek olması gerektiğini her zaman unutmayın.

05:54.440 --> 06:01.490
İş parçacığı oluşturan işlevde yerel bir değişkeni temsil eden bellek olmamalıdır.

06:01.490 --> 06:02.210
Doğru.

06:03.210 --> 06:09.160
Yani bu bellek yığını ya statik değişken olmalı ya da heap üzerinde bir bellek olmalıdır.

06:09.180 --> 06:14.400
Yığın üzerinde bir bellek dediğimde, bu sadece dinamik olarak tahsis edilmiş bellek anlamına gelir.

06:14.640 --> 06:21.750
İş parçacığına girdi olarak yerel bir değişkenin adresini, başka bir deyişle yığında bulunan bir belleğin

06:21.750 --> 06:24.930
adresini aktarırsanız bu çok yanlış olur.

06:26.340 --> 06:32.130
Yani bu 47 numaralı satır bir çatal noktası, değil mi?

06:34.250 --> 06:34.970
Konu.

06:34.970 --> 06:40.400
Bir create işlevi çağrılır ve bu işlev bir ana iş parçacığı bağlamında yürütülür.

06:40.400 --> 06:41.000
Doğru.

06:41.030 --> 06:48.050
Çalışmakta olan ana iş parçacığıdır, ancak 47 numaralı satırda ana iş parçacığı artık bir alt iş parçacığı

06:48.050 --> 06:49.460
doğurmaktadır.

06:49.490 --> 06:52.730
Yani 47 numaralı satır sizin çatal noktanız.

06:53.300 --> 06:59.840
Artık p thread underscore create API'sinin başarı durumunda sıfır döndürdüğüne ilişkin bu yararlı yorumları okuyabilirsiniz.

06:59.870 --> 07:04.070
Aksi takdirde, bir hatayı temsil eden negatif bir değer döndürür.

07:04.100 --> 07:04.910
Doğru.

07:04.910 --> 07:08.690
Böylece her zaman bu p iş parçacığı tarafından döndürülen değeri yazdırabilirsiniz.

07:08.690 --> 07:15.590
Bu hata kodundan dönen hata kodunun ne olduğunu bilmek için create işlevinin altını çizin, iş parçacığı oluşturma

07:15.590 --> 07:22.070
işleminiz başarısız olursa bunun arkasındaki nedenin ne olduğunu öğrenebilirsiniz.

07:22.640 --> 07:26.900
Ve bununla birlikte thread one Create fonksiyonunun uygulamasını tamamlamış olduk.

07:26.900 --> 07:27.680
Doğru.

07:28.070 --> 07:33.950
Artık p thread underscore create fonksiyonunun son argümanının neden heap ya da statik bellek

07:34.050 --> 07:38.820
üzerinde bulunan bir bellek olması gerektiğini çok iyi anlayabilirsiniz.

07:38.850 --> 07:45.570
Bunun nedeni, 47 numaralı satır olan çatal noktasında yeni bir iş parçacığının başlatılacak olmasıdır.

07:45.570 --> 07:46.200
Değil mi?

07:46.200 --> 07:53.220
Ve yeni iş parçacığı fonksiyon iş parçacığını yürütmeye başlarken, bir alt çizgi oluşturma döndürülecektir.

07:53.250 --> 07:55.830
Yani, yürütme işlemini tamamlayacaktır.

07:55.830 --> 08:02.400
Ve fonksiyon geri döndüğünde, fonksiyonun içindeki tüm yerel değişkenlerin yok edildiğini zaten

08:02.400 --> 08:03.480
biliyoruz.

08:03.480 --> 08:04.140
Değil mi?

08:04.140 --> 08:10.950
Bu nedenle, bir çatal noktası içeren işlevin yerel değişkeninin adresini

08:10.950 --> 08:13.220
aktaramazsınız.

08:13.230 --> 08:22.050
Yani bu durumda, eğer bu girdi sadece bir carry star iş parçacığı girdisi olsaydı, o zaman bu argümanın geçişi

08:22.050 --> 08:24.120
çok yanlış olurdu.

08:24.120 --> 08:24.900
Değil mi?

08:25.410 --> 08:32.940
Yeni iş parçacığınız yürütmeye başladığında, bir alt çizgi ile oluşturulan

08:32.940 --> 08:41.520
işlev iş parçacığı geri dönmüş ve yerel değişken olan bu bellek yok edilmiş olacaktır.

08:41.520 --> 08:49.080
Yani bu, yeni iş parçacığınıza sağladığınız argüman veya girdinin aslında geçersiz bir bellek olduğu anlamına

08:49.080 --> 08:49.860
gelir.

08:49.980 --> 08:57.090
Bu nedenle bu girdi ya statik bellek olmalı ya da heap üzerinde bir bellek olmalıdır.

08:57.850 --> 09:00.520
Şimdi bu işlevin ne olduğunu tartışalım.

09:00.520 --> 09:02.560
Bu tehdit fonksiyonu geri çağrısıdır.
