POSIX Semaphore dalam C

Posix Semaphore Dalam C



“Walaupun setiap bahasa pengaturcaraan mempunyai banyak perpustakaan untuk tujuan tertentu, perpustakaan POSIX C mempunyai tempatnya. Ia telah direka bentuk untuk mencipta penyelarasan yang hebat antara proses dan banyak membantu dalam menggunakan multithreading dalam program, iaitu, mencipta berbilang benang dan menyegerakkan pelaksanaannya. Dalam panduan ini hari ini, anda akan melihat ilustrasi mudah menggunakan semaphore POSIX dalam C. Untuk contoh kod C asas, kita mesti mengkonfigurasi pengkompilnya dalam sistem. Tetapi, sebelum itu, kita perlu mengemas kini sistem kerana ia adalah langkah yang mesti diperlukan untuk pelaksanaan kod yang lancar. Oleh itu, pertanyaan yang dipaparkan dalam snap yang dilampirkan adalah satu kemestian untuk mengemas kini dan menaik taraf sistem pengendalian Linux anda dengan utiliti 'apt'.


Proses ini memerlukan lebih kurang 55 Kb ruang pada platform Linux anda untuk melaksanakan kemas kini dengan lancar. Jika anda sanggup memberi ruang sebanyak itu, ketik 'y' untuk meneruskan. Pemprosesan akan selesai dalam beberapa minit.








Selepas sistem dinaik taraf sepenuhnya, kami akan mengkonfigurasi pengkompil bahasa C dalam sistem kami dengan utiliti apt-get dalam arahan 'pasang'. Gunakan 'gcc' sebagai kata kunci, dan itu sahaja.





sem_init()

Semafor baru akan dibuat apabila sudah ada semafor yang tidak dikenali di 's'; jika tidak, semafor yang sedia ada itu akan dibuang. Sepanjang kaedah ini, 's' bermaksud contoh Semaphore yang telah dibina dan dikongsi ialah isyarat atau panji yang menunjukkan sama ada semaphore boleh diedarkan dengan kaedah forked() atau sebaliknya. Nilai input berfungsi sebagai titik permulaan set semaphore.





Int sem_init ( nor_t * s, int dikongsi, nilai int tidak ditandatangani ) ;

Sem_wait()

Dengan melaksanakan tindakan kunci semaphore pada semaphore yang ditentukan oleh 's', kaedah sem_wait() memegang semaphore tersebut. Prosedur sem-tunggu akan digunakan untuk mengekalkan semafor atau membiarkannya berdiri dalam barisan. Beberapa proses yang terlebih beban sebelum ini terjaga apabila beberapa proses lain memanggil sem_post().



int sem_tunggu ( nor_t * s ) ;

no_post()

Apabila siaran sem dipanggil, nilai dinaikkan, dan kemudian salah satu daripada operasi yang disandarkan atau menunggu sebelum ini mula berjalan, iaitu membuka kunci semaphore yang telah dikunci.

int sem_post ( nor_t * s ) ;

no_destroy()

Semafor tanpa nama yang dimulakan 's' dimusnahkan menggunakan fungsi sem destroy().

int sem_destroy ( nor_t * s ) ;

Contoh

Untuk memahami semaphore, kita akan membuat fail C terlebih dahulu dan kemudian menambah kod padanya. Untuk menciptanya, gunakan pertanyaan 'sentuh', dan anda akan menemui fail baharu dalam folder rumah sistem anda.


Sekarang, anda perlu membuka fail C kosong anda dengan beberapa editor mudah untuk menjana kod yang baik di dalamnya. Kami telah mencuba editor 'nano' setakat ini, seperti yang ditunjukkan dalam snap di bawah.


Seperti yang kita semua tahu bahawa semua bahasa pengaturcaraan tidak boleh berfungsi tanpa perpustakaan kerana perpustakaan ini mempunyai sejumlah besar kelas, struktur, fungsi dan objek untuk digunakan untuk keseluruhan sistem berfungsi. Oleh itu, kami memulakan program C ini dengan menggunakan beberapa perpustakaan asas dan mesti ada untuk Semaphore POSIX.

Untuk menggunakan perpustakaan ini dalam kod, kita perlu menggunakan aksara '#' dengan kata kunci 'termasuk' untuk setiap perpustakaan. Pada masa ini, kami telah menambah sejumlah 4 perpustakaan yang mesti ada dalam program ini. Jika tidak, program kami tidak akan berfungsi dengan betul. Pustaka pengepala 'stdio.h' pertama biasanya mesti ada dalam setiap program C kerana ia membolehkan kami mempunyai operasi input dan output dalam kod. Oleh itu, kami menggunakannya untuk menambah input dan mendapatkan output daripada kod dengan lancar. Pustaka kedua yang kami gunakan di sini ialah 'pthread.h' yang merupakan satu kemestian untuk penggunaan pengaturcaraan benang, iaitu, multithreading.

Kami akan menggunakan perpustakaan ini untuk mencipta benang dalam program. Pustaka seterusnya dan paling penting dalam kod ini ialah 'semaphore.h'. Ia telah digunakan untuk menyegerakkan benang dengan lancar. Akhir sekali, pustaka ialah 'uistd.h,' yang membolehkan kami menggunakan pelbagai fungsi dan pemalar yang ditakrifkan pengguna. Sekarang, kami telah mengisytiharkan semaphore 's' menggunakan objek terbina dalam 'sem_t' perpustakaan semaphore. Di sini terdapat fungsi yang ditakrifkan pengguna 'T' tanpa jenis pemulangan. Ia telah menggunakan beberapa fungsi semafor terbina dalam untuk melaksanakan penyegerakan. Fungsi sem_wait() ada di sini untuk menahan semaphore “s” menggunakan aksara “&”.

Dalam penahanan, pernyataan printf() telah dilaksanakan bersama-sama dengan fungsi 'tidur' untuk menjadikan program ini tidur selama 4 saat. Kenyataan printf() lain memaparkan mesej baharu, dan fungsi sem_post() dilaksanakan untuk melepaskan kunci pada semaphore “s.”

#include
#include
#include
#include
neither_t s;
batal * T ( batal * arg ) {
sem_tunggu ( & s ) ;
printf ( 'Selamat datang! \n ' ) ;
tidur ( 4 ) ;
printf ( 'Bye! \n ' ) ;
sem_post ( & s ) ;
}



Mari kita lihat dengan baik kaedah utama() program C ini untuk semaphore. Fungsi sem_init() telah digunakan di sini untuk mencipta semaphore “s” baharu yang belum diedarkan dengan kaedah forked(), iaitu, “0”, dan titik permulaannya ditetapkan kepada 1. Objek pthread_t daripada pthread perpustakaan C telah digunakan untuk membuat dua utas menggunakan dua objek utas, o1 dan o2. Pernyataan printf() di sini untuk memaparkan bahawa kita akan mencipta benang pertama menggunakan fungsi pthread_create() pada baris seterusnya.

Kami telah menghantar objek benang o1 ke fungsi ini dengan sekatan NULL dan memanggil fungsi 'T' dengan menghantarnya dalam parameter. Selepas tidur selama 4 saat,  utas lain dibuat dengan objek o2 dan fungsi pthread_join() digunakan di sini untuk menyertai utas dengan fungsi main(). Fungsi sem_destroy() ada di sini untuk memusnahkan semafor 's', dan semua utas yang disekat akan dikeluarkan juga.

int utama ( ) {
sem_init ( & s, 0 , 1 ) ;
pthread_t o1, o2;
printf ( 'Dalam Thread 1 sekarang... \n ' ) ;
pthread_create ( & o1,NULL,T,NULL ) ;
tidur ( 4 ) ;
printf ( 'Dalam Thread ke-2 sekarang... \n ' ) ;
pthread_create ( & o2,NULL,T,NULL ) ;
pthread_join ( o1,NULL ) ;
pthread_join ( o2,NULL ) ;
tiada_musnah ( & s ) ;
kembali 0 ;
}



Kami sedang menyusun atur cara C dengan pengkompil 'Gcc'; pilihan '-lrt' dan '-lpthread' digunakan untuk melaksanakan fungsi benang POSIX. Semasa menjalankan pertanyaan '.a/.out', urutan pertama telah dibuat. Ia tidur selepas mencetak mesej pertama.


Benang kedua disegerakkan, dan selepas 4 saat, benang pertama dilepaskan, dan benang kedua dikunci selama 4 saat.


Akhirnya, benang kedua juga dikeluarkan.

Kesimpulan

Itu sahaja tentang Semaphore POSIX dalam C sambil menggunakan beberapa fungsi utamanya untuk menyegerakkan benang yang berbeza. Selepas melalui artikel ini, anda akan dapat memahami POSIX dengan lebih banyak lagi.