Soru Pthread nasıl çalışır?


Java ve C # 'da çok iş parçacıklı programlarda deneyimliyim ve Linux'ta C üzerinde nasıl yapılacağını öğrenmeye başlıyorum. Linux'ta programlama anlamında "büyüdüm", bu yüzden yüksek bir seviyede bellek felsefesi, süreç yönetimi, vb.

Benim sorum nasıl iş parçacığı yapmak değil. Pthread'in gerçekten ne yaptığını bilmek isterim. Bir süreci engeller ve süreçler arası iletişiminizi sizin için nasıl ele alır? Yoksa sadece adres alanını yönetiyor mu? Esprili detaylar istiyorum :) Googling sadece “nasıl yapılacağını” sorgular, “nasıl çalışır” sorularını değil.


18
2018-01-31 19:06


Menşei




Cevaplar:


Linux'ta ikiside fork() ve ptrheads aynı syscall kullanıyor clone(), yeni bir süreç yaratır. Aralarındaki fark sadece gönderdikleri parametrelerdir. clone()Yeni bir iş parçacığı oluştururken, her iki işlemi de aynı bellek eşlemelerini kullanır.

Unutmayın, Linux'ta (ve diğer modern Unixlerde) bellek eşlemeleri, yığınlar, işlemci durumu, PID'ler ve diğerleri bir sürecin ortogonal özellikleridir; Böylece yeni bir süreç ve süreç durumu (yeni bir yığın) ile yeni bir süreç yaratabilirsiniz.


9
2018-01-31 19:26



Bir iş parçacığının paylaşamayacağı başka bir şey var - TID değer. - caf


Ayrıntılar gerçekten çok karmaşıktır (glibc kaynak koduna bir link göndermeden), ama size bakmak için daha iyi şeyler verebilirim:

  1. Pthread kullanır sys_clone () Çekirdek, birçok veri yapısını diğer iş parçacıklarıyla paylaşan yeni bir görev olarak gördüğü yeni iş parçacıkları oluşturmak için.

  2. Senkronizasyon yapmak için, pthread futexes çekirdeğinde.


12
2018-01-31 19:20



+1: sadece ekleyerek fork() aynı syscall kullanır, ancak yeni görev ebeveyn ile daha az yapı paylaşır. - Javier


İşte pthread.c kaynağıdır. Bu, sorunuzu cevaplamanıza yardımcı olabilir.


4
2018-01-31 19:18



Bu, Linux uygulamasının değil, pthread'in Windows uygulamasıdır. - Victor