Kunci C++ Mutex

Kunci C Mutex



C++ dikenal sebagai salah satu bahasa pemrograman tercepat dengan kinerja yang baik, presisi tinggi, dan sistem manajemen memori yang memadai. Bahasa pemrograman ini juga mendukung eksekusi beberapa utas secara bersamaan dengan berbagi banyak sumber daya di antara mereka. Dalam multithreading, utas hanya untuk melakukan operasi baca yang tidak membuat masalah karena utas tidak terpengaruh oleh apa yang dilakukan utas lain pada saat itu. Tetapi jika utas ini harus berbagi sumber daya di antara mereka, satu utas dapat memodifikasi data pada saat itu yang membuat masalah. Untuk mengatasi masalah ini, kami memiliki C++ 'Mutex' yang mencegah akses banyak sumber daya ke kode/objek kami dengan menyediakan sinkronisasi yang menyatakan bahwa akses ke objek/kode hanya dapat diberikan ke satu utas pada satu waktu, sehingga beberapa utas tidak akan dapat mengakses objek itu secara bersamaan.

Prosedur:

Kita akan mengetahui bagaimana kita dapat menghentikan akses beberapa utas ke suatu objek sekaligus menggunakan kunci mutex. Kita akan berbicara tentang sintaks dari mutex lock, apa itu multiple threading, dan bagaimana kita dapat menangani masalah yang disebabkan oleh multiple threading menggunakan mutex lock. Kemudian, kita akan mengambil contoh dari multiple threading dan menerapkan mutex lock pada mereka.







Sintaksis:

Jika kita ingin mempelajari bagaimana kita dapat mengimplementasikan kunci mutex sehingga kita dapat mencegah akses beberapa utas secara bersamaan ke objek atau kode kita, kita dapat menggunakan sintaks berikut:



$ std :: mutex mut_x

$mut_x. kunci ( ) ;

Fungsi_nama batal ( ) {

$ // kode yang ingin kita sembunyikan dari beberapa utas akan ditulis di sini

$mut_x. membuka kunci ( ) ;

}

Kami sekarang akan menggunakan sintaks ini pada contoh dummy dan dalam kode semu (yang tidak bisa kami jalankan begitu saja di editor kode) untuk memberi tahu Anda bagaimana kami bisa menggunakan sintaks ini secara tepat seperti yang disebutkan berikut ini:



$ std :: mutex mut_x

Blok kosong ( ) {

$mut_x. kunci ( ) ;

$ std :: cout << 'halo' ;

$mut_x. membuka kunci ( ) ;

}

Contoh:

Dalam contoh ini, mari kita coba membuat operasi multithread terlebih dahulu dan kemudian mengelilingi operasi ini dengan mutex lock and unlock untuk memberikan sinkronisasi operasi ke kode atau objek yang dibuat. Mutex berurusan dengan kondisi balapan yang merupakan nilai yang tidak dapat diprediksi dan bergantung pada pergantian utas yang sadar waktu. Untuk mengimplementasikan contoh untuk mutex, pertama-tama kita perlu mengimpor perpustakaan penting dan wajib dari repositori. Library yang dibutuhkan adalah:





$ # sertakan

$ # sertakan

$ # sertakan

Pustaka 'iostream' memberi kita fungsi untuk menampilkan data sebagai Cout, membaca data sebagai Cin, dan mengakhiri pernyataan sebagai endl. Kami menggunakan perpustakaan 'utas' untuk memanfaatkan program atau fungsi dari utas. Pustaka 'mutex' memungkinkan kita untuk mengimplementasikan kunci mutex dan membuka kunci dalam kode. Kami menggunakan '# include' karena ini memungkinkan semua program yang terkait dengan perpustakaan disertakan dalam kode.

Sekarang, setelah langkah sebelumnya selesai, kita mendefinisikan kelas mutex atau variabel global untuk mutex menggunakan std. Kemudian, kita membuat fungsi untuk mutex lock dan unlock yang bisa kita panggil setelahnya dalam kode. Dalam contoh ini, kami menamai fungsi ini sebagai blok. Di badan fungsi blok, pertama-tama kita panggil 'mutex.lock()' dan mulai menulis logika kodenya.



Mutex.lock() menolak akses utas lain untuk mencapai objek atau kode yang kami buat sehingga hanya satu utas yang dapat membaca objek kami pada satu waktu. Dalam logika, kami menjalankan for loop yang berjalan pada indeks dari 0 hingga 9. Kami menampilkan nilai dalam loop. Setelah logika ini dibuat di kunci mutex setelah operasinya selesai atau setelah keluar dari logika, kami memanggil metode “mutex.unlock()”. Pemanggilan metode ini memungkinkan kita untuk membuka kunci objek yang dibuat dari kunci mutex karena akses objek ke satu utas telah disediakan sebelumnya dan setelah operasi pada objek itu dilakukan oleh satu utas pada satu waktu. Kami sekarang ingin utas lainnya mengakses objek atau kode itu juga. Jika tidak, kode kita bergerak dalam situasi “deadlock” yang menyebabkan objek yang dibuat dengan mutex tetap berada dalam situasi terkunci selamanya dan tidak ada utas lain yang dapat mengakses objek tersebut. Oleh karena itu, operasi yang tidak lengkap terus dijalankan. Setelah ini, kami keluar dari fungsi blok dan pindah ke utama.

Di bagian utama, kami hanya menampilkan mutex yang kami buat dengan membuat tiga utas menggunakan 'std :: thread thread_name (memanggil fungsi blok yang sudah dibuat di sini di mana kami membuat mutex)' dengan nama thread1, thread2, dan thread3, dll Dengan cara ini, tiga utas dibuat. Kami kemudian menggabungkan ketiga utas ini untuk dieksekusi secara bersamaan dengan memanggil 'thread_name. metode gabung ()”. Dan kemudian, kami mengembalikan nilai yang sama dengan nol. Penjelasan contoh yang disebutkan sebelumnya diimplementasikan dalam bentuk kode yang dapat ditunjukkan pada gambar berikut:

Dalam output kode, kita dapat melihat eksekusi dan tampilan ketiga utas satu per satu. Kita dapat melihat meskipun aplikasi kita termasuk dalam kategori multithreading. Namun, tidak ada utas yang menimpa atau memodifikasi data dan membagikan sumber daya yang dimodifikasi karena implementasi mutex dari 'blok fungsi'.

Kesimpulan

Panduan ini memberikan penjelasan rinci tentang konsep fungsi mutex yang digunakan dalam C++. Kami membahas apa itu aplikasi multithreading, masalah apa yang harus kami hadapi dalam aplikasi multithreading, dan mengapa kami perlu mengimplementasikan mutex untuk aplikasi multithreading. Kami kemudian membahas sintaks untuk mutex dengan contoh dummy menggunakan pseudo-code. Kemudian, kami mengimplementasikan contoh lengkap pada aplikasi multithreading dengan mutex pada visual studio C++.