C POSIX Semaforları

C Posix Semaforlari



“Her programlama dilinin belirli amaçlar için birçok kütüphanesi olmasına rağmen, C'nin POSIX kütüphanesinin bir yeri vardır. Süreçler arasında büyük bir uyum yaratmak için tasarlanmıştır ve programlar içinde çoklu iş parçacığının kullanılmasına, yani çoklu iş parçacıklarının oluşturulmasına ve yürütülmesinin senkronize edilmesine çok yardımcı olur. Bugünkü bu kılavuzda, C'de POSIX semaforlarını kullanmanın basit bir örneğini göreceksiniz. Temel C kodu örnekleri için, derleyicisini sistemde yapılandırmamız gerekiyor. Ancak bundan önce, kodun sorunsuz yürütülmesi için gerekli bir adım olduğu için sistemi güncellememiz gerekiyor. Bu nedenle, ekteki ekte görüntülenen sorgu, Linux işletim sisteminizi “apt” yardımcı programıyla güncellemek ve yükseltmek için bir zorunluluktur.


Bu işlem, güncellemeleri sorunsuz bir şekilde gerçekleştirmek için Linux platformunuzda yaklaşık 55 Kb alan gerektiriyordu. Bu kadar yer vermek istiyorsanız, devam etmek için “y”ye dokunun. İşlem birkaç dakika içinde tamamlanacaktır.








Sistem tamamen upgrade edildikten sonra “install” komutundaki apt-get yardımcı programı ile sistemimizde C dilinin derleyicisini yapılandıracağız. Anahtar kelime olarak 'gcc' kullanın, o kadar.





sem_init()

“s” noktasında zaten tanımlanamayan bir semafor olduğunda yeni bir semafor oluşturulacaktır; aksi takdirde, zaten mevcut olan semafor atılacaktır. Bu yöntem boyunca 's', oluşturulmuş bir Semafor örneğini temsil eder ve paylaşılan, semaforun çatallı() yöntemiyle veya başka bir şekilde dağıtılıp dağıtılamayacağını belirten bir sinyal veya flamadır. Girilen değer, semaforun ayarlanan başlangıç ​​noktası olarak hizmet eder.





Int sem_init ( nor_t * s, int paylaşılan, imzasız int değeri ) ;

Sem_bekle()

sem_wait() yöntemi, 's' ile belirtilen semafor üzerinde bir semafor kilitleme eylemi yürüterek bu semaforu tutar. sem-wait prosedürü, bir semaforu tutmak veya sıraya girmesine izin vermek için kullanılacaktır. Daha önce aşırı yüklenmiş bazı işlemler, başka bir işlem sem_post()'u çağırdığında uyanır.



int sem_wait ( nor_t * s ) ;

no_post()

sem post çağrıldığında, değer artırılır ve daha sonra önceden yedeklenmiş veya bekleyen işlemlerden biri çalışmaya başlar, yani zaten kilitli semaforun kilidini açar.

int sem_post ( nor_t * s ) ;

yok_yok()

Başlatılmış adsız bir semafor 's', sem destroy() işlevi kullanılarak yok edilir.

int sem_destroy ( nor_t * s ) ;

Örnek

Semaforları anlamak için önce bir C dosyası oluşturacağız ve ardından ona bir kod ekleyeceğiz. Bir tane oluşturmak için 'dokunma' sorgusunu kullanın ve yeni dosyayı sisteminizin ana klasöründe bulacaksınız.


Şimdi, içinde iyi kod oluşturmak için boş C dosyanızı basit bir düzenleyiciyle açmalısınız. Aşağıdaki ekte gösterildiği gibi, şu ana kadar “nano” düzenleyiciyi deniyoruz.


Hepimizin bildiği gibi, tüm programlama dilleri kütüphaneler olmadan çalışamaz, çünkü bu kütüphaneler genel sistem çalışması için kullanılacak çok sayıda sınıf, yapı, fonksiyon ve nesneye sahiptir. Bu yüzden bu C programını, POSIX Semaforları için bazı temel ve sahip olunması gereken kitaplıkların kullanımıyla başlatıyoruz.

Bu kütüphaneleri kodda kullanmak için her kütüphane için “include” anahtar kelimesi ile “#” karakterini kullanmalıyız. Şu anda, bu programda olması gereken toplam 4 kütüphane ekledik. Aksi takdirde programımız düzgün çalışmayacaktır. İlk “stdio.h” başlık kitaplığı genellikle her C programında bulunması gereken bir kitaptır çünkü kodda giriş ve çıkış işlemleri yapmamızı sağlar. Bu nedenle, sorunsuz bir şekilde girdi eklemek ve koddan çıktı almak için kullanıyoruz. Burada kullandığımız ikinci kütüphane ise thread programlama yani multithreading kullanımı için olmazsa olmaz olan “pthread.h” dir.

Bir programda thread oluşturmak için bu kütüphaneyi kullanacağız. Bu koddaki bir sonraki ve en önemli kütüphane “semaphore.h”dir. Konuları sorunsuz bir şekilde senkronize etmek için kullanılmıştır. Son olarak, kullanıcı tanımlı çeşitli işlevleri ve sabitleri kullanmamızı sağlayan kitaplık “unistd.h”dir. Şimdi, semafor kitaplığının “sem_t” yerleşik nesnesini kullanarak “s” semaforunu ilan ettik. Geri dönüş tipi olmayan, kullanıcı tanımlı “T” fonksiyonu geliyor. Senkronizasyonu gerçekleştirmek için bazı yerleşik semafor işlevlerini kullanıyor. sem_wait() işlevi, “&” karakterini kullanarak “s” semaforunu tutmak için burada.

Bekletme içinde, bu programı 4 saniye uyutmak için printf() ifadesi “uyku” işleviyle birlikte yürütüldü. Başka bir printf() ifadesi yeni bir mesaj görüntüler ve semafor “s” üzerindeki kilidi serbest bırakmak için sem_post() işlevi yürütülür.

#include
#include
#include
#include
ne_t s;
geçersiz * T ( geçersiz * argüman ) {
sem_wait ( & s ) ;
baskı ( 'Hoş geldin! \n ' ) ;
uyumak ( 4 ) ;
baskı ( 'Hoşçakal! \n ' ) ;
sem_post ( & s ) ;
}



Semaforlar için bu C programının main() yöntemine iyi bir göz atalım. Burada sem_init() işlevi, forked() yöntemiyle dağıtılmayan yeni bir semafor 's' oluşturmak için kullanılmıştır, yani '0' ve başlangıç ​​noktası 1 olarak ayarlanmıştır. Pthread'den pthread_t nesnesi. C kütüphanesi, o1 ve o2 olmak üzere iki iş parçacığı nesnesini kullanarak iki iş parçacığı oluşturmak için kullanıldı. printf() ifadesi, bir sonraki satırda pthread_create() işlevini kullanarak ilk iş parçacığını oluşturacağımızı göstermek için burada.

O1 thread nesnesini NULL kısıtlamaları ile bu fonksiyona geçiriyoruz ve parametrelerde geçirerek “T” fonksiyonunu çağırıyoruz. 4 saniyelik bir uykudan sonra, o2 nesnesiyle başka bir iş parçacığı oluşturulur ve burada pthread_join() işlevi, iş parçacıklarını bir main() işleviyle birleştirmek için kullanılır. sem_destroy() işlevi, 's' semaforunu yok etmek için buradadır ve engellenen tüm diziler de serbest bırakılacaktır.

int ana ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
baskı ( 'Şimdi 1. Konuda ... \n ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
uyumak ( 4 ) ;
baskı ( 'Şimdi 2. Konuda... \n ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2,NULL ) ;
no_destroy ( & s ) ;
dönüş 0 ;
}



C programını “Gcc” derleyicisi ile derliyoruz; POSIX iş parçacığı işlevlerini yürütmek için “-lrt” ve “-lpthread” seçenekleri kullanılır. “.a/.out” sorgusu çalıştırıldığında, ilk iş parçacığı oluşturuldu. İlk mesajı yazdırdıktan sonra uyku moduna geçer.


İkinci iş parçacığı senkronize edildi ve 4 saniye sonra ilk iş parçacığı serbest bırakıldı ve ikinci iş parçacığı 4 saniye kilitlendi.


Sonunda, ikinci iş parçacığı da serbest bırakıldı.

Çözüm

C'deki POSIX Semaforları ile ilgili olan bu kadar, farklı iş parçacıklarını senkronize etmek için bazı ana işlevlerini kullanırken. Bu makaleyi okuduktan sonra, POSIX'i giderek daha fazla anlayabileceksiniz.