Sizin gibi okuyucular MUO'yu desteklemeye yardımcı oluyor. Sitemizdeki bağlantıları kullanarak bir satın alma işlemi gerçekleştirdiğinizde, bir ortaklık komisyonu kazanabiliriz. Devamını oku.

Linux'ta, POSIX iş parçacığı (pthread) kitaplığını kullanarak C/C++'da iş parçacıkları oluşturabilir ve yönetebilirsiniz. Diğer işletim sistemlerinden farklı olarak, Linux'ta bir iş parçacığı ile işlem arasında çok az fark vardır. Bu nedenle Linux, iş parçacıklarını genellikle hafif işlemler olarak adlandırır.

pthread kitaplığını kullanarak iş parçacıkları oluşturabilir, bunların sona ermesini bekleyebilir ve açıkça sonlandırabilirsiniz.

Linux'ta İş Parçacığı Kullanımının Tarihi

Linux sürüm 2.6'dan önce, ana iş parçacığı uygulaması LinuxThreads idi. Bu uygulama, performans ve senkronizasyon işlemleri açısından önemli sınırlara sahipti. Çalışabilecek maksimum iş parçacığı sayısına ilişkin bir sınır, onları 1000'lerle sınırladı.

2003 yılında, IBM ve RedHat'tan geliştiriciler tarafından yönetilen bir ekip,

instagram viewer
Yerel POSIX Konu Kitaplığı (NPTL) projesi mevcuttur. Linux'ta Java Sanal Makinesi ile ilgili performans sorunlarını çözmek için ilk olarak RedHat Enterprise sürüm 3'te tanıtıldı. Bugün, GNU C kütüphanesi her iki iş parçacığı mekanizmasının uygulamalarını içerir.

Bunların hiçbiri, bir Sanal Makinenin tamamen kullanıcı modunda yöneteceği ve çalıştıracağı yeşil iş parçacıklarının bir uygulaması değildir. pthread kitaplığını kullandığınızda, çekirdek bir program her başladığında bir iş parçacığı oluşturur.

Çalışan herhangi bir işlem için iş parçacığına özgü bilgileri aşağıdaki dosyalarda bulabilirsiniz. /proc//task. Bu, işlem bilgileri için standart konumdur. procfs Linux standardı. Single-thread uygulamalar için bu dizin altında PID ile aynı değere sahip bir görev kaydı olduğu görülecektir.

Threadlerin Çalışma Mantığı

İş parçacıkları, işletim sisteminde şu anda çalışan işlemler gibidir. Tek işlemcili sistemlerde (örneğin mikrodenetleyiciler), işletim sistemi çekirdeği iş parçacıklarını simüle eder. Bu, işlemlerin dilimleme yoluyla aynı anda çalışmasına izin verir.

Tek çekirdekli bir işletim sistemi, bir seferde gerçekten yalnızca bir işlem çalıştırabilir. Ancak, içinde çok çekirdekli veya çok işlemcili sistemler, bu işlemler aynı anda çalışabilir.

C'de Konu Oluşturma

kullanabilirsiniz pthread_create yeni bir iş parçacığı oluşturmak için işlev. bu pthread.h başlık dosyası, iş parçacığıyla ilgili diğer işlevlerle birlikte imza tanımını içerir. Konular, ana programla aynı adres alanını ve dosya tanımlayıcıları kullanır.

pthread kütüphanesi senkronizasyon işlemleri için gerekli olan mutex ve koşullu işlemler için gerekli desteği de içermektedir.

pthread kitaplığının işlevlerini kullanırken, derleyicinin pthread yürütülebilir dosyanıza kitaplık. Gerekirse, derleyiciyi kullanarak kitaplığa bağlantı vermesini söyleyebilirsiniz. -l seçenek:

gcc-o Ölçek test_thread.c -lpthread

pthread_create işlevi aşağıdaki imzaya sahiptir:

intpthread_create(pthread_t *iplik, sabitpthread_attr_t *özellik, geçersiz *(*başlangıç_rutin)(geçersiz *), geçersiz *arg)

Prosedür başarılı olursa 0 döndürür. Bir sorun varsa, sıfır olmayan bir hata kodu döndürür. Yukarıdaki işlev imzasında:

  • bu iplik parametre türündedir pthread_t. Oluşturulan iş parçacığına bu referansla her zaman erişilebilir olacaktır.
  • bu özellik parametresi, özel davranış belirlemenizi sağlar. İle başlayan bir dizi iş parçacığına özgü işlevleri kullanabilirsiniz. pthread_attr_ Bu değeri ayarlamak için. Olası özelleştirmeler, zamanlama ilkesi, yığın boyutu ve ayırma ilkesidir.
  • start_routine iş parçacığının çalışacağı işlevi belirtir.
  • argüman iş parçacığı tarafından işleve iletilen genel bir veri yapısını temsil eder.

İşte örnek bir uygulama:

#katmak
#katmak
#katmak
#katmak

geçersiz *çalışan(geçersiz *veri)
{
karakter *isim = (karakter*)veri;

için (int ben = 0; ben < 120; ben++)
{
uyu(50000);
printf("İş parçacığı adından merhaba = %s\n", ad);
}

printf("Konu %s tamamlandı!\n", ad);
geri dönmekHÜKÜMSÜZ;
}

intana(geçersiz)
{
pthread_t th1, th2;
pthread_create(&th1, HÜKÜMSÜZ, işçi, "X");
pthread_create(&th2, HÜKÜMSÜZ, işçi, "Y");
uyumak(5);
printf("Ana programdan çıkılıyor\n");
geri dönmek0;
}

Konu Tipleri

Bir iş parçacığı döndüğünde ana() bir uygulamadaki işlev, tüm iş parçacıkları sona erer ve sistem, programın kullandığı tüm kaynakları serbest bırakır. Aynı şekilde, herhangi bir iş parçacığından aşağıdaki gibi bir komutla çıkarken çıkış(), programınız tüm konuları sonlandıracaktır.

İle pthread_join işlevi, bunun yerine bir iş parçacığının sonlanmasını bekleyebilirsiniz. Bu işlevi kullanan iş parçacığı, beklenen iş parçacığı sona erene kadar engelleyecektir. Birleştirilebilir iş parçacıklarının sonlandırılması, CPU tarafından planlanmaması, hatta katılamama gibi durumlarda bile sistemden kullandıkları kaynaklar geri dönmez. ptread_join.

Bazen pthread_join ile katılmanın mantıklı olmadığı durumlar vardır; Örneğin, iş parçacığının ne zaman biteceğini tahmin etmek imkansızsa. Bu durumda thread'in döndüğü noktada sistemin tüm kaynakları otomatik olarak döndürmesini sağlayabilirsiniz.

Bunu başarmak için, ilgili konuları şu şekilde başlatmalısınız: MÜSTAKİL durum. Bir iş parçacığı başlatırken, AYIR durum, bir iş parçacığı öznitelik değerleri aracılığıyla veya pthread_detach işlev:

intpthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
intpthread_detach(pthread_t iplik);

İşte pthread_join() kullanımının bir örneği. İlk programdaki ana işlevi aşağıdakiyle değiştirin:

intana(geçersiz)
{
pthread_t th1, th2;
pthread_create(&th1, HÜKÜMSÜZ, işçi, "X");
pthread_create(&th2, HÜKÜMSÜZ, işçi, "Y");
uyumak(5);
printf("ana programdan çıkılıyor\n");
pthread_join (th1, HÜKÜMSÜZ);
pthread_join (th2, HÜKÜMSÜZ);
geri dönmek0;
}

Programı derleyip çalıştırdığınızda çıktınız şu şekilde olacaktır:

Y iş parçacığından merhaba
X iş parçacığından merhaba
Y iş parçacığından merhaba
...
Y iş parçacığından merhaba
ana programdan çıkmak
X iş parçacığından merhaba
...
X iş parçacığından merhaba
Konu X tamamlandı!
Y iş parçacığından merhaba
Konu Y tamamlandı!

Konu Sonlandırma

Bir diziyi pthread_cancel çağrısıyla iptal edebilir, karşılık gelen ileti dizisini iletebilirsiniz. pthread_t İD:

intpthread_cancel(pthread_t iplik);

Bunu aşağıdaki kodda çalışırken görebilirsiniz. Yine, yalnızca ana işlev farklıdır:

intana(geçersiz)
{
pthread_t th1, th2;
pthread_create(&th1, HÜKÜMSÜZ, işçi, "X");
pthread_create(&th2, HÜKÜMSÜZ, işçi, "Y");
uyumak(1);
printf("> Konu Y İptal Ediliyor!!\n");
pthread_cancel (th2);
uyu(100000);
printf("> X Dizisi İptal Ediliyor!\n");
pthread_cancel (th1);
printf("ana programdan çıkılıyor\n");
geri dönmek0;
}

Konular Neden Oluşturulur?

İşletim sistemleri her zaman bir veya daha fazla CPU'da kendi oluşturduğu bir listeden veya kullanıcı tarafından oluşturulan bir dizi listesinden iş parçacığı çalıştırmaya çalışır. Bazı iş parçacıkları donanımdan bir giriş/çıkış sinyali bekledikleri için çalışamazlar. Ayrıca gönüllü olarak bekliyor, başka bir ileti dizisinden yanıt bekliyor veya başka bir ileti dizisi onları engelliyor olabilir.

pthread kullanarak oluşturduğunuz thread'lere ayırdığınız kaynakları ayarlayabilirsiniz. Bu, özel bir zamanlama politikası olabilir veya istenirse FIFO veya Round-robin gibi zamanlama algoritmalarını seçebilirsiniz.