2 result(s) in 1 page(s)
Previous Page  - 1 / 1 -  Next Page
Thread Kavramı 23 May 08, Friday @ 17:37

Thread nedir?

Thread (kanal), bir programda çalışacak komutlar dizisidir. UNIX işlemleri, main() fonksiyonuyla başlayan tek bir thread'den oluşur. Thread konseptinden önce birden çok komutu paralel olarak çalıştırmanın yolu, fork() ve exec() sistem fonksiyonlarını kullanmaktı. Ama thread mekanizmasını kullanarak, bir program içinde paralel olarak birden çok işi yapmak mümkündür. Ne var ki bunu yapmak, aşağıda değineceğimiz bazı özel durumlar nedeniyle dikkat isteyen bir iştir.

Neden thread kullanmalıyım sorusuna cevap vermek önemlidir. Bu mekanizma kullanılarak yazılan bir program, onsuz yazılan bir programdan hem daha zordur, hem de daha uzun zaman alır. Dolayısıyla eğer gerçekten kullanmanız gerekmiyorsa, thread kullanmaya çalışmak pek de verimli ve tavsiye edilecek bir durum değildir. Çünkü bu meka

Peki avantajları neler? Üç temel avantajdan bahsedebiliriz: hız, girdi-çıktı verimi ve taşınabilirlik. Bunları tek tek incelersek:

Hız: Threadler arasında iletişim oldukça hızlıdır. Eğer algoritmanız hızlı iletişim gerektiriyorsa thread mekanizmasını kullanmak için iyi bir sebebiniz var demektir.

Girdi-Çıktı(I/O) verimi: Normal bir UNIX işleminde, bloklanmış bir girdi-çıktı isteği bütün işlemin durmasına ya da beklemesine sebep olabilir. Ama thread mekanizmasında bir bloklama isteği sadece isteği yapan thread'i ilgilendirdiği için programın geri kalanı bundan etkilenmez.

Taşınabilirlik: POSIX thread'ler, çok az bir hız kaybıyla farklı platformlara taşınabilir. Burada taşınabilirlikten kasıt farklı işletim sistemlerinden çok farklı mimarilerdir.

Thread tanımlaması

Nasıl her işlemin(process) bir işlem tanımlayıcısı (ID) varsa, thread'lerin de IDsi vardır. Aralarındaki fark şu ki process kimlikleri sistem bazında verilirken, thread kimlikleri ait oldukları process bazında verilir.

Thread kimliklerinin veri türü 'pthread_t' dir. Bu veri türüne integer türü gibi davranmak ve bu mantıkla üzerinde işlem yapmak mümkün değildir. Ama thread kimliklerini karşılaştırmak için de fonksiyon vardır.



#include <pthread.h> //eşitse sıfır, değilse sıfır harici değer döner

int pthread_equal(pthread_t tid1,pthread_t tid2);

 

pthread_t, bir yapıdır(struct). Yapı olması nedeniyle de değerini yazdırmanın taşınabilir bir yöntemi yoktur.

Bir thread'in ID'sini pthread_self fonksiyonu ile elde eder.



#include <pthread.h>

pthread_t pthread_self(void);



Thread yaratmak

Unix process modelinde, her process sadece bir thread kontrol eder. Thread tabanlı modelde de aynı durum geçerlidir. Her process sadece bir thread'den oluşur. Yeni thread'ler program çalışırken oluşur.

Yeni bir thread, pthread_create fonksiyonuyla yaratılır.



#include <pthread.h>

int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr,

void *(*start_rtn) (void), (void) *restrict arg);



tidp ile gösterilen hafıza adresi, yeni yaratılan thread'in ID'sini tutar. Yaratılan thread'in başlangıç adresi start_rtn'dir.

Bir thread yaratıldığında hangi thread'in önce çalışacağı konusunda bir garanti yoktur. yaratılan thread de olabilir çağıran thread de. Yeni yaratılan thread, yaratan thread'in adres alanına erişebilir. Ama bekleyen sinyal listesi bu thread için temizlenir.

pthread fonksiyonları, hata olduğunda “errno” kullanmak yerine bir hata kodu dönerler.

thread yarattığınız zaman, main fonksiyonununzda bir sleep kullanmanız tavsiye edilir. Çünkü ana işleminiz bir thread bitmeden önce bitebilir, bu da hataya sebep olur.

Thread yok etmek

Bir işlem içinde herhangi bir thread exit, _Exit ya da _exit fonksiyonlarından birini çağırırsa, bütün işlem sonlandırılır.

Bütün işlemi sonlandırmadan bir thread'i sonlandırmanın ise üç yolu vardır:

  1. thread, start rutininden döner. Dönüş değeri thread'in exit kodudur.

  2. Bir thread, aynı işlemdeki bir thread tarafından iptal edilir.

  3. thread, pthread_exit fonksiyonunu çağırır.



#include <pthread.h>

void pthread_exit(void * rval_ptr);



Buradaki rval_ptr, türü olmayan bir göstericidir. Bu gösterici, işlemlerdeki diğer thread'ler tarafından pthread_join fonksiyonu sayesinde erişilebilir.



#include <pthread.h>

int pthread_join(pthread_t thread, void **rval_ptr);



Bu fonksiyonun detaylarını incelemenizi tavsiye ederim.



Bir thread, aynı işlemdeki başka bir thread'i pthread_cancel fonksiyonu ile yokedebilir.

 

#include <pthread.h>

int pthread_cancel(pthread_t tid);



Thread senkronizasyonu

Multi-thread programlar yazarken en kritik nokta, paylaşılan bilgilerin kontrolüdür. Eğer bir thread diğer thread'lerin üzerinde değişiklik yapamayacağı bir veriyi okuyorsa sorun yoktur. Ama bir threadin okuduğu veriyi başka bir thread'in değiştirebilme yeteneği varsa bu noktada dikkat edilmesi gerekir. Çünkü birinin okuduğu değeri diğeri değiştirdiğinde tutarsızlık olur ve bu da programınızın düzgün çalışmasını (belkide çalışmasını) engeller.

Bu sorunu aşmanın çeşitli yolları vardır. Biri bilgisayar mimarisini buna göre düzenlemektir ki bir yazılımcı bunun varolduğuna güvenemez. İkinci yol değiştirilen değerlere kilit koymaktır(lock). Ayrıca thread senkronizasyonu da bir yöntemdir. Senkronizasyon en kısa tabiriyle thread'lerin bir değişiklik yapacakları zaman diğer thread'lerle birlikte hareket etmesi ve birinin yaptığı değişiklikten diğerlerinin de haberdar edilmesidir.

Kısa bir İnternet araştırması sonucu bu konuyla ilgili birçok örnek kod bulabilirsiniz.

Mutex

pthread mutex(mutual-exclusion) kullanarak verilerin aynı anda sadece bir thread tarafından değiştirilebileceğini garanti ederek verileri koruyabiliriz. Mutex, bir veriyi değiştirmeden hemen önce diğer thread'lerin veriye erişimini engellemek üzere konulan bir kilit olarak ifade edilebilir.

Mutex mekanizması sadece thread'lerin aynı veri erişimi kurallarını uyguladığı durumlarda işe yarar.

Mutex değişkenleri, pthread_mutex veri türüyle ifade edilir. Mutex kullanmadan önce ya PTHREAD_MUTEX_INITIALIZER sabiti ya da pthread_mutex_init fonksiyonu ile başlatılmalıdır. Eğer mutex, malloc kullanarak dinamik olarak yerleştirildiyse, hafızayı boşaltmadan önce pthread_mutex_destroy fonksiyonu çağrılmalıdır.



#include <pthread.h>

int pthread_mutex_init (pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);

int pthread_mutex_destroy (pthread_mutex_t *mutex);



Yukarıda bahsettiğim kilitleme işlemlerini gerçekleştirmek için de aşağıdaki fonksiyonlar kullanılır.



#include <pthread.h>

int pthread_mutex_lock (pthread_mutex_t *mutex);

int pthread_mutex_trylock (pthread_mutex_t *mutex);

int pthread_mutex_unlock (pthread_mutex_t *mutex);



Multithread programlama burada bahsettiğimden çok daha uzun bir konudur. Bu sebeple benim yazımı bir başlangıç yazısı ya da kavramlar açısından yol gösterici olarak kabul etmenizi ve konuyu özellikle örnek kodlar inceleyerek daha detaylı ele almanızı tavsiye ederim. Çünkü mutlthread programlama, tehlikeli programlama tekniklerinden biridir. Araştırmalarınız için diğer birçok konuda olduğu gibi bu konuda da güzel bir başlangıç noktasına sahipsiniz: man pthread.h (Tabi eğer Linux kullanıcısı iseniz:D)



Tags: Programlama  Linux  thread   ,  Comments: 0 ( Add your comment )
wxWidgets 08 January 08, Tuesday @ 10:07

Son kullanıcı yazılımın detayını bilmez. Kurduğu programda iki şey bekler: Hızlı çalışsın ve rahat kullanılsın.

Hızlı çalışması, programı yazan yazılımcının zaten üstüne çok düşündüğü işler arasındadır. Tasarım sürecinde hızlı ve verimli çalışan bir program yazabilmek için elinden geleni yapar. Ama raht kullanılabilen, kullanıcı dostu, bir program, arayüzle ilgilidir. Kod yazarken her türlü cambazlıklardan ayrı bir zevk alan yazılımcılar, nedense arayüz tasarlarken sürükle-bırak tarzı ve arayüzle programın iletişimini en kolay şekilde sağlayabileceği araçları tercih eder.

İşte bu araçlar içinde sektörde daha çok tercih edilen birkaç araç vardır. Yazılımı yapan kişi olarak, sizin ihtiyacınıza göre bunlardan birini tercih edersiniz. Ben en çok önem verdiğim konulardan biri taşınabilirlik, yani hazırlanan arayüzün farklı işletim sistemlerinde çalışabilme yeteneğine sahip olması, olduğu için en çok Qt ve WxWidgets severim. Bu yazının konusu da WxWidgets ve bunun Qt ile karşılaştırması.

WxWidgets nedir?

wxWidgets, 1992 yılında Edinburg Üniversitesinde Julian Smart tarafından başlatıldı. İlk olarak Unix ve Windows'ta çalışan uygulamalar geliştirmek için başlatılan bir proje olmasına rağmen zamanla gelişerek Mac platformu, WinCE, ve başka birçok platformda çalışabilir hale getirildi. Açık kaynak kodlu olması sebebiyle çok hızlı gelişen, AOL gibi önemli firmalar tarafından da kullanılan bir araç olarak her geçen gün biraz daha güçlenmekte.

wxWidgets, programcının grafik arayüzüne sahip uygulamalar hazırlaması için bir araçtır. wxWidgets, birçok sınıf ve metot bulunan bir kütüphaneye sahiptir. WxWidget, dosyalar, çok kanallılık, uygulama ayarları, süreçlerarası iletişim, veritabanı erişimi ve benzeri birçok yaygın işle ilgili sınıflara sahiptir.

wxWidgets,platformun kendi kütüphanelerini kullanması sayesinde, hangi platformda çalışıyorsa o platformun görüntüsünü sağlayabilmektedir. Tek ihtiyacı olan gerekli kütüphanelerle bağlantı ve bir adet C++ derleyicisi. Bu sayede OS X üzerinde Aqua, Linux üzerinde GTK ya da Motif gibi her platformda platformun kendi arayüz özelliklerini kullanır.

wxwidgets, bedava ve açık kaynak kodludur. Bu wxWidgets'ın sadece maliyet düşürmek için kullanılması gerektiği anlamına gelmez. Aksine, diğer bütün açık kaynak kodlu yazılımlar gibi,açık kaynak kodlu yazılımlara gönül vermiş birçok deneyimli ve yetkin yazılımcının desteğini alarak, gücünü arttırması, wxWidgets'ı güncel ve ihtiyaçları fazlasıyla karşılayan bir yazılım halini alıyor.

wxWidgets, MFC'nin kullandığına benzer bir olay sistemine sahiptir. Bu sistem, olayları üye fonksiyonlarla statik ya da dinamik olarak ilişkilendirmeye izin verir.

 

Çok dil desteği:

wxWidgets genellikle C++ ile birlikte anılır. Fakat bunun yanında başka dillere de destek verir. Bu dillerden bazı yaygın olanları; Perl, Python, Ruby, Basic, JavaScript. Ayrıca Java ile birlikte kullanılması için de çalışılıyor.

Araçlar:

wxWidgets için uygun olan araçlardan en yaygın olanları wxDesigner, DialogBlocks, ve wxDev-C++. Başka araçlar da vardır ve açık kaynak kodlu olduğu için yeni ihtiyaçlara göre yeni seçeneklerin de karşımıza çıkması şaşırtıcı olmaz.

 

wxWidgets Qt karşılaştırması:

  • Hem wxWidgets, hem Qt arayüzle ilgisi olmayan özelliklere de sahiptir.(tarih, ağ, openGL özellikleri gibi)

  • Qt3, Mac ve Unix platformlarında geliştirilen açık kaynak kodlu uygulamalar için GPL lisansına sahiptir. Ticari uygulamalar ve Windows üzerinde geliştirilen her türlü uygulamalar için ise QPL lisansı vardır. Qt4'ün Windows için GPL lisansı vardır. Fakat wxWidgets her platformdaki ticari ya da ticari olmayan her uygulama için değiştirilmiş bir LGPL lisansına sahiptir ve uygulama geliştiriciler için herhangi bir lisans sorunu yoktur.

  • QT, wxWidgets gibi yerel portlara sahip değildir. Yani her ne kadar gerçekçi çizimler elde edebiliyor olsa da Qt her platformda kendi arayüz parçalarını(widget) çizer. Arayüz parçalarının programın kendisiyle iletişimini bizzat Qt yapar. Benzer bir özellik, wxUniversal ile birlikte wxWidget tarafından da kazanılmıştır. Ayrıca diğer platformlar için Qt'nin arayüz parçaları yerel değildir fakat KDE ve Qtopia platformları için bunlar yereldir.

  • wxWidgets, AOL Communicator gibi bazı büyük projeler tarafından kullanılmaktadır, fakat QT bu tür büyük çaplı projelerde daha yaygın olarak kullanılmaktadır.

  • Qt'nin sanal fonksiyonları, onu daha nesne yönelimli bir merkeze çeker. Burada ortaya çıkan fark şudur: Qt ile yazılan kodlar daha kısadır fakat wxWidgets daha hızlı çalışır.

  • Qt, QtDesigner adında bir arayüz tasarlama aracına sahiptir. wxWidgets ise bu konuda birden fazla seçenek sunar.

  • wxWidgets başka kütüphaneleri kullanabildiği için, Qt gibi görünen wxWidgets programları yazmak da mümkündür.

Sonuç:

Bu yazıda wxWidgets'ın ne olduğunu anlatmaya çalıştım. Vakit bulabilirsem ilerde daha detaylı ve teknik bir yazı da hazırlar, wxWidgets'ı kullanmaya karar veren insanlarayardımcı olmaya çalışırım.

Son bölümde sadece Qt ile karşılaştırmamın sebebi, halen en çok bilinen ve kullanılan alternatifin Qt olmasıdır. Nette kısa bir arama sonucunda diğer alternatiflerle de karşılaştırmalar bulabilirsiniz.

 



Tags: Programlama  wxWidgets  Arayüz Programlama   ,  Comments: 1 ( Add your comment )
Previous Page  - 1 / 1 -  Next Page