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ı
göstereceğim.
Merhaba, dünya nokta C, değil mi?
Ve C'de çok iş parçacıklı bir program yazmak için, pthreads olan bu başlık dosyasını dahil etmeniz
gerekir.
Doğru.
Bu nedenle, Posix iş parçacıklarıyla çalışmanız gerektiğinde dahil etmeniz gereken bir başlık dosyasıdır.
Öyleyse çok iş parçacıklı programımızı yazmaya başlayalım.
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
ç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
çalıştıracaktır.
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ığı
denir.
Ş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
görelim.
Öyleyse geliştirmemize elbette ana fonksiyondan başlayalım.
Bu yüzden yapacağım şey, ana fonksiyondan yeni bir iş parçacığı oluşturmak olacak.
Bu yüzden yeni bir iş parçacığı oluşturmak için Thread one Create adında kullanıcı tanımlı bir fonksiyon
yazacağım.
Kısaca size bu fonksiyonun uygulamasını göstereceğim ve ana iş parçacığı olduğu için oluşturacağı
yeni iş parçacığının ana iş parçacığı olacak.
Şimdi bir noktayı hatırlayın, eğer ana iş parçacığı sonlanırsa, ana iş parçacığının oluşturduğu
tüm alt iş parçacıkları da sonlanır.
Doğru.
Bu yüzden ana iş parçacığının sonlandırılmamasını isteriz.
Doğru.
Ana iş parçacığınız sonlandırılırsa, tüm uygulamanız sonlandırılır.
Doğru.
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.
Değil mi?
Bu yüzden ana iş parçacığımızın sonlanmasını istemeyiz.
Bu nedenle, bu duraklatma işlevini kullanabilmek için başlık dosyası hash include
unistd'yi dahil etmeniz gerekir. h.
Bu programı çalıştırdığınızda, ana fonksiyonunuz bu duraklama satırında duracaktır, değil mi?
Feshedilmeyecektir.
Şimdi Thread one Create fonksiyonunun uygulanmasını tartışalım.
Bu fonksiyonda bir alt iş parçacığı oluşturacağız.
Evet arkadaşlar, şimdi thread one Create fonksiyonumuzun uygulamasına başlayalım.
Başlangıç olarak, bu fonksiyonda yeni bir iş parçacığı oluşturmam gerektiğini zaten biliyoruz.
Değil mi?
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.
Yani p thread dot h başlık dosyasında tanımlanan dahili bir veri yapısıdır.
Son programcı veya geliştirici olarak, bu veri yapısının iç tanımı hakkında endişelenmenize gerek yok,
yani bu veri yapılarının diğer üyeleri hakkında endişelenmenize gerek yok, değil
mi?
Bu veri yapısı bir programcı veya geliştirici için opaktır.
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
anlamına geliyor, değil mi?
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.
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.
Doğru.
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
vardır.
Doğru.
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
gerektiğinde programınızda kullanabileceğiniz bir değişken olarak düşünebilirsiniz.
Değil mi?
Şimdi, bu iş parçacığı tanıtıcısını oluşturduktan sonra, oluşturacağımız iş parçacığına girdi olarak hizmet
edecek bazı girdiler alalım.
Doğru.
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
yapmak için bazı girdilere ihtiyacınız var, değil mi?
Tıpkı bazı işleri yapan fonksiyonlarınız olduğu ve fonksiyonların girdiye ihtiyaç duyduğu gibi.
Benzer şekilde, ipliklerin de girdiye ihtiyacı vardır.
Evet.
Bir Merhaba Dünya programı yazdığımıza göre, bir dizeden başka bir şey olmayan çok basit bir
girdi alalım.
Değil mi?
Ve bu dize basitçe benim bu programda bir numaralı konu olduğumu söylüyor.
Sadece bir çocuk iş parçacığı oluşturacağız.
Şimdi, oluşturacağımız alt iş parçacığına sağlanması gereken bir girdi verisi
aldık.
Yeni iş parçacığı API kullanılarak oluşturulur.
P iplik alt çizgi oluşturun.
Şimdi bu, Posix iş parçacığı kütüphanemiz tarafından sağlanan dahili bir API'dir.
Değil mi?
Böylece p thread underscore create API kullanılarak yeni iş parçacığı oluşturulur.
Şimdi, bu API'ye aktardığımız argümanı tartışalım.
Bu API'nin ilk argümanı iş parçacığı tanıtıcısından başka bir şey değildir.
Doğru.
Bu yüzden iş parçacığı tanıtıcısının adresini aktarmanız gerekir.
İkinci argümanı daha sonra tartışacağız.
Şimdilik, bunu null olarak geçirebilirsiniz.
Üçüncü bağımsız değişken fonksiyona bir işaretçidir.
Bunu kısaca tartışacaktık ve dördüncü argüman, yeni iş parçacığımıza girdi olarak sağlamamız gereken
bir veri veya giriş verisinden başka bir şey değildir.
Dolayısıyla dördüncü argümanda belleğin adresini geçmeniz gerekir ve bu bellek yeni iş parçacığı tarafından bir
girdi olarak kullanılacaktır.
Doğru.
Bu nedenle, yeni iş parçacığına girdi olarak sağlanan belleğin heap üzerindeki bellek veya statik
bellek olması gerektiğini her zaman unutmayın.
İş parçacığı oluşturan işlevde yerel bir değişkeni temsil eden bellek olmamalıdır.
Doğru.
Yani bu bellek yığını ya statik değişken olmalı ya da heap üzerinde bir bellek olmalıdır.
Yığın üzerinde bir bellek dediğimde, bu sadece dinamik olarak tahsis edilmiş bellek anlamına gelir.
İş parçacığına girdi olarak yerel bir değişkenin adresini, başka bir deyişle yığında bulunan bir belleğin
adresini aktarırsanız bu çok yanlış olur.
Yani bu 47 numaralı satır bir çatal noktası, değil mi?
Konu.
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.
Doğru.
Ç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ığı
doğurmaktadır.
Yani 47 numaralı satır sizin çatal noktanız.
Artık p thread underscore create API'sinin başarı durumunda sıfır döndürdüğüne ilişkin bu yararlı yorumları okuyabilirsiniz.
Aksi takdirde, bir hatayı temsil eden negatif bir değer döndürür.
Doğru.
Böylece her zaman bu p iş parçacığı tarafından döndürülen değeri yazdırabilirsiniz.
Bu hata kodundan dönen hata kodunun ne olduğunu bilmek için create işlevinin altını çizin, iş parçacığı oluşturma
işleminiz başarısız olursa bunun arkasındaki nedenin ne olduğunu öğrenebilirsiniz.
Ve bununla birlikte thread one Create fonksiyonunun uygulamasını tamamlamış olduk.
Doğru.
Artık p thread underscore create fonksiyonunun son argümanının neden heap ya da statik bellek
üzerinde bulunan bir bellek olması gerektiğini çok iyi anlayabilirsiniz.
Bunun nedeni, 47 numaralı satır olan çatal noktasında yeni bir iş parçacığının başlatılacak olmasıdır.
Değil mi?
Ve yeni iş parçacığı fonksiyon iş parçacığını yürütmeye başlarken, bir alt çizgi oluşturma döndürülecektir.
Yani, yürütme işlemini tamamlayacaktır.
Ve fonksiyon geri döndüğünde, fonksiyonun içindeki tüm yerel değişkenlerin yok edildiğini zaten
biliyoruz.
Değil mi?
Bu nedenle, bir çatal noktası içeren işlevin yerel değişkeninin adresini
aktaramazsınız.
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
çok yanlış olurdu.
Değil mi?
Yeni iş parçacığınız yürütmeye başladığında, bir alt çizgi ile oluşturulan
işlev iş parçacığı geri dönmüş ve yerel değişken olan bu bellek yok edilmiş olacaktır.
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
gelir.
Bu nedenle bu girdi ya statik bellek olmalı ya da heap üzerinde bir bellek olmalıdır.
Şimdi bu işlevin ne olduğunu tartışalım.
Bu tehdit fonksiyonu geri çağrısıdır.