POSIX Semaphore dalam C

Posix Semaphore Dalam C



“Meskipun setiap bahasa pemrograman memiliki banyak perpustakaan untuk tujuan tertentu, perpustakaan POSIX dari C memiliki tempatnya sendiri. Ini telah dirancang untuk menciptakan harmonisasi yang hebat di antara proses dan banyak membantu dalam menggunakan multithreading dalam program, yaitu, membuat banyak utas dan menyinkronkan pelaksanaannya. Dalam panduan ini hari ini, Anda akan melihat ilustrasi sederhana menggunakan semaphore POSIX di C. Untuk contoh kode C dasar, kita harus mengkonfigurasi kompilernya di sistem. Tapi, sebelum itu, kita perlu memperbarui sistem karena ini adalah langkah yang harus dilakukan untuk kelancaran eksekusi kode. Dengan demikian, kueri yang ditampilkan dalam snap terlampir adalah hal yang harus dimiliki untuk memperbarui dan meningkatkan sistem operasi Linux Anda dengan utilitas 'apt'.


Proses ini membutuhkan sekitar 55 Kb ruang pada platform Linux Anda untuk melakukan pembaruan dengan lancar. Jika Anda bersedia memberikan ruang sebanyak itu, ketuk 'y' untuk melanjutkan. Pemrosesan akan selesai dalam beberapa menit.








Setelah sistem ditingkatkan sepenuhnya, kita akan mengonfigurasi kompiler bahasa C di sistem kita dengan utilitas apt-get di perintah 'instal'. Gunakan 'gcc' sebagai kata kunci, dan hanya itu.





semi_init()

Semafor baru akan dibuat ketika sudah ada semafor tak dikenal di 's'; jika tidak, semaphore yang sudah ada akan dibuang. Sepanjang metode ini, 's' adalah singkatan dari instance Semaphore yang telah dibangun, dan shared adalah sinyal atau panji yang menunjukkan apakah semaphore dapat didistribusikan dengan metode forked() atau sebaliknya. Nilai input berfungsi sebagai titik awal set semaphore.





Int semi_init ( nor_t * s, int dibagikan, nilai int tidak ditandatangani ) ;

Sem_tunggu()

Dengan mengeksekusi tindakan penguncian semaphore pada semaphore yang ditentukan oleh “s,” metode sem_wait() menyimpan semaphore itu. Prosedur sem-wait akan digunakan untuk mempertahankan semaphore atau membiarkannya berdiri dalam antrean. Beberapa proses yang sebelumnya kelebihan beban terbangun ketika beberapa proses lain memanggil sem_post().



int sem_tunggu ( nor_t * s ) ;

no_post()

Ketika sem post dipanggil, nilainya meningkat, dan kemudian salah satu operasi yang sebelumnya dicadangkan atau menunggu mulai berjalan, yaitu, membuka semaphore yang sudah terkunci.

int sem_post ( nor_t * s ) ;

tidak_hancur()

Semaphore 's' tanpa nama yang diinisialisasi dihancurkan menggunakan fungsi sem destroy().

int sem_destroy ( nor_t * s ) ;

Contoh

Untuk memahami semaphore, kita akan membuat file C terlebih dahulu dan kemudian menambahkan kode ke dalamnya. Untuk membuatnya, gunakan kueri 'sentuh', dan Anda akan menemukan file baru di folder beranda sistem Anda.


Sekarang, Anda harus membuka file C kosong Anda dengan beberapa editor sederhana untuk menghasilkan kode yang bagus di dalamnya. Kami telah mencoba editor 'nano' sejauh ini, seperti yang ditunjukkan pada snap di bawah.


Seperti yang kita semua tahu bahwa semua bahasa pemrograman tidak dapat bekerja tanpa perpustakaan karena perpustakaan ini menampung sejumlah besar kelas, struktur, fungsi, dan objek yang akan digunakan untuk kerja sistem secara keseluruhan. Jadi kami memulai program C ini dengan menggunakan beberapa pustaka dasar dan yang harus dimiliki untuk POSIX Semaphores.

Untuk menggunakan library ini dalam kode, kita harus menggunakan karakter “#” dengan kata kunci “include” untuk setiap library. Saat ini, kami telah menambahkan total 4 perpustakaan yang harus ada dalam program ini. Jika tidak, program kami tidak akan bekerja dengan benar. Pustaka header 'stdio.h' pertama biasanya harus dimiliki di setiap program C karena memungkinkan kita untuk memiliki operasi input dan output dalam kode. Oleh karena itu, kami menggunakannya untuk menambahkan input dan mendapatkan output dari kode dengan lancar. Pustaka kedua yang kami gunakan di sini adalah 'pthread.h' yang merupakan keharusan untuk penggunaan pemrograman utas, yaitu multithreading.

Kami akan menggunakan perpustakaan ini untuk membuat utas dalam sebuah program. Pustaka berikutnya dan terpenting dalam kode ini adalah 'semaphore.h'. Ini telah digunakan untuk menyinkronkan utas dengan lancar. Last but not least, perpustakaan adalah 'unistd.h,' yang memungkinkan kita untuk menggunakan fungsi dan konstanta lain-lain yang ditentukan pengguna. Sekarang, kita telah mendeklarasikan semaphore “s” menggunakan objek built-in “sem_t” dari library semaphore. Inilah fungsi yang ditentukan pengguna utas 'T' tanpa tipe pengembalian. Telah memanfaatkan beberapa fungsi semaphore built-in untuk melakukan sinkronisasi. Fungsi sem_wait() disini untuk menahan semaphore “s” menggunakan karakter “&”.

Dalam penangguhan, pernyataan printf() dieksekusi bersama dengan fungsi 'sleep' untuk membuat program ini tidur selama 4 detik. Pernyataan printf() lain menampilkan pesan baru, dan fungsi sem_post() dijalankan untuk melepaskan kunci pada semaphore “s.”

#sertakan
#sertakan
#sertakan
#sertakan
tidak_t s;
ruang kosong * T ( ruang kosong * argumen ) {
sem_tunggu ( & s ) ;
printf ( 'Selamat datang! \n ' ) ;
tidur ( 4 ) ;
printf ( 'Selamat tinggal! \n ' ) ;
sem_post ( & s ) ;
}



Mari kita perhatikan baik-baik metode main() dari program C ini untuk semaphore. Fungsi sem_init() telah digunakan di sini untuk membuat semaphore “s” baru yang belum didistribusikan dengan metode forked(), yaitu, “0”, dan titik awalnya disetel ke 1. Objek pthread_t dari pthread library C digunakan untuk membuat dua utas menggunakan dua objek utas, o1 dan o2. Pernyataan printf() di sini untuk menampilkan bahwa kita akan membuat utas pertama menggunakan fungsi pthread_create() di baris berikutnya.

Kami telah meneruskan objek utas o1 ke fungsi ini dengan batasan NULL dan memanggil fungsi 'T' dengan meneruskannya dalam parameter. Setelah tidur selama 4 detik,  thread lain dibuat dengan objek o2, dan fungsi pthread_join() digunakan di sini untuk menggabungkan thread dengan fungsi main(). Fungsi sem_destroy() ada di sini untuk menghancurkan semaphore “s”, dan semua utas yang diblokir juga akan dilepaskan.

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



Kami mengkompilasi program C dengan compiler “Gcc”; opsi '-lrt' dan '-lpthread' digunakan untuk menjalankan fungsi thread POSIX. Saat menjalankan kueri '.a/.out', utas pertama dibuat. Ia pergi tidur setelah mencetak pesan pertama.


Utas kedua disinkronkan, dan setelah 4 detik, utas pertama dilepaskan, dan utas kedua dikunci selama 4 detik.


Pada akhirnya, utas kedua juga dirilis.

Kesimpulan

Itu saja tentang POSIX Semaphore di C sambil memanfaatkan beberapa fungsi utamanya untuk menyinkronkan utas yang berbeda. Setelah melalui artikel ini, Anda akan dapat lebih memahami POSIX.