Thread Nedir? Thread C'de Nasıl Kullanılır ve Nasıl Yazılır?
Thread’ler sayesinde process’ler aynı anda birden fazla işin yapabilmektedir. Thread’ler aynı anda sadece tek bir işi yerine getirirler. Bir process birden fazla thread’e sahip olabilir. Bu yazımızda C programlama dilinde thread oluşturmaya değineceğiz.
15.02.2022 tarihli yazı 10219 kez okunmuştur.
Bir thread, bir process içindeki bir yürütme yoludur. Bir process birden fazla thread içerebilirir, bu yapılara multithreading denir.
Thread, kendi program sayacına, bir stack scope ve bir register set’e sahip olan bir yürütme birimidir. Bir thread’in kendisi bir program değildir; bir thread kendi başına çalışamaz. Bunun yerine, bir program içinde çalışırlar. Aynı process içindeki threadler, birbirleriyle paylaştıkları bellek alanlarında çalışırlar.
Thread, kendi program sayacına, bir stack scope ve bir register set’e sahip olan bir yürütme birimidir. Bir thread’in kendisi bir program değildir; bir thread kendi başına çalışamaz. Bunun yerine, bir program içinde çalışırlar. Aynı process içindeki threadler, birbirleriyle paylaştıkları bellek alanlarında çalışırlar.
►İlginizi Çekebilir: C# ile Veri Yapıları: Linked List (Bağlı Liste)
Neden Multithreading?
Bir thread, lightweight process olarak da bilinir. Threadler çok çekirdekli işlemcilerde farklı çekirdeklerde eş zamanlı olarak çalıştırılabilirler, buna paralel programming denir. Buradaki fikir, bir process’i birden çok thread’e bölerek paralellik elde etmektir. Threadler, aşağıdaki nedenlerden dolayı processlerden daha hızlı çalışır:
► Thread oluşturmak çok hızlıdır.
► Threadler arasında bağlam değişimi çok hızlıdır.
► Threadler kolayca sonlandırılabilirler.
► Threadler arası iletişim daha hızlıdır.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void *worker_thread(void *arg)
{
printf("This is worker_thread()\n");
return NULL;
}
int main()
{
pthread_t my_thread;
int ret;
printf("In main: creating thread\n");
ret = pthread_create(&my_thread, NULL, &worker_thread, NULL);
if(ret != 0) {
printf("Error: pthread_create() failed\n");
}
pthread_join(my_thread, NULL);
return 0;
}
Kodda main thread, work_thread() yürütmek için ikinci bir thread’i oluşturacaktır. Main()’de, sistemdeki thread’i tanımlamak için kullanılan, bir tam sayı olan pthread_t türünde my_thread adında bir değişken bildirdik. my_thread bildirildikten sonra, bir thread oluşturmak için pthread_create() fonksiyonunu çağırırız. pthread_create() 4 tane bağımsız değişken alır. İlk argüman, bu fonksiyon tarafından ayarlanan my_thread için bir pointerdir. İkinci argüman nitelikleri belirtir. Değer NULL ise, varsayılan öznitelikler kullanılacaktır. Üçüncü argüman, oluşturulacak thread için yürütülecek fonksiyonun adıdır. Dördüncü argüman, work_thread fonksiyonuna argümanları iletmek için kullanılır. Thread’ler için pthread_join() fonksiyonu, işlemler için wait() işlevine eşdeğerdir. pthread_join'e yapılan bir çağrı, ilk argümana eşit tanımlayıcıya sahip thread sona erene kadar çağıran thread’i engeller.
Başka bir örnek daha yapacak olacak olursak: Bu örnekte 5 tane thread oluşturalım.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define N 5
void *worker_thread(void *arg)
{
printf("This is worker_thread #%ld\n", (long)arg);
return NULL;
}
int main()
{
pthread_t my_thread[N];
long id;
int ret;
printf("In main: creating thread\n");
for(id = 1; id <= N; id++) {
ret = pthread_create(&my_thread[id], NULL, worker_thread, (void*)id);
if(ret != 0) {
printf("Error: pthread_create() failed\n");
}
}
for(id = 1; id <= N; id++) {
pthread_join(my_thread[id], NULL);
}
return 0;
}
►İlginizi Çekebilir: En Çok Tercih Edilen Yazılım Dilleri|2021
C’de Thread/Multithreading Yazmak
Linux/Unix işletim sistemini kullanarak örneklerimizi gerçekleştireceğiz. Kodlarımızı yazdığımız ide ise eclipse’dir. #include <pthread.h> kütüphanesini kullanacağız.#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void *worker_thread(void *arg)
{
printf("This is worker_thread()\n");
return NULL;
}
int main()
{
pthread_t my_thread;
int ret;
printf("In main: creating thread\n");
ret = pthread_create(&my_thread, NULL, &worker_thread, NULL);
if(ret != 0) {
printf("Error: pthread_create() failed\n");
}
pthread_join(my_thread, NULL);
return 0;
}
Kodda main thread, work_thread() yürütmek için ikinci bir thread’i oluşturacaktır. Main()’de, sistemdeki thread’i tanımlamak için kullanılan, bir tam sayı olan pthread_t türünde my_thread adında bir değişken bildirdik. my_thread bildirildikten sonra, bir thread oluşturmak için pthread_create() fonksiyonunu çağırırız. pthread_create() 4 tane bağımsız değişken alır. İlk argüman, bu fonksiyon tarafından ayarlanan my_thread için bir pointerdir. İkinci argüman nitelikleri belirtir. Değer NULL ise, varsayılan öznitelikler kullanılacaktır. Üçüncü argüman, oluşturulacak thread için yürütülecek fonksiyonun adıdır. Dördüncü argüman, work_thread fonksiyonuna argümanları iletmek için kullanılır. Thread’ler için pthread_join() fonksiyonu, işlemler için wait() işlevine eşdeğerdir. pthread_join'e yapılan bir çağrı, ilk argümana eşit tanımlayıcıya sahip thread sona erene kadar çağıran thread’i engeller.
Ekran Çıktısı:
Başka bir örnek daha yapacak olacak olursak: Bu örnekte 5 tane thread oluşturalım.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define N 5
void *worker_thread(void *arg)
{
printf("This is worker_thread #%ld\n", (long)arg);
return NULL;
}
int main()
{
pthread_t my_thread[N];
long id;
int ret;
printf("In main: creating thread\n");
for(id = 1; id <= N; id++) {
ret = pthread_create(&my_thread[id], NULL, worker_thread, (void*)id);
if(ret != 0) {
printf("Error: pthread_create() failed\n");
}
}
for(id = 1; id <= N; id++) {
pthread_join(my_thread[id], NULL);
}
return 0;
}
Ekran Çıktısı:
Kaynak:
►geeksforgeeks.org
►geeksforgeeks.org
►afteracademy.com
►iitk.ac.in
►bogotobogo.com
YORUMLAR
Aktif etkinlik bulunmamaktadır.
- Dünyanın En Görkemli 10 Güneş Tarlası
- Dünyanın En Büyük 10 Makinesi
- 2020’nin En İyi 10 Kişisel Robotu
- Programlamaya Erken Yaşta Başlayan 7 Ünlü Bilgisayar Programcısı
- Üretimin Geleceğinde Etkili Olacak 10 Beceri
- Olağan Üstü Tasarıma Sahip 5 Köprü
- Dünyanın En İyi Bilim ve Teknoloji Müzeleri
- En İyi 5 Tıbbi Robot
- Dünyanın En Zengin 10 Mühendisi
- Üretim için 6 Fabrikasyon İşlemi
- DrivePro Yaşam Döngüsü Hizmetleri
- Batarya Testinin Temelleri
- Enerji Yönetiminde Ölçümün Rolü: Verimliliğe Giden Yol
- HVAC Sistemlerinde Kullanılan EC Fan, Sürücü ve EC+ Fan Teknolojisi
- Su İşleme, Dağıtım ve Atık Su Yönetim Tesislerinde Sürücü Kullanımı
- Röle ve Trafo Merkezi Testlerinin Temelleri | Webinar
- Chint Elektrik Temel DIN Ray Ürünleri Tanıtımı
- Sigma Termik Manyetik Şalterler ile Elektrik Devrelerinde Koruma
- Elektrik Panoları ve Üretim Teknikleri
- Teknik Servis | Megger Türkiye
ANKET