GNU/Linux >> Belajar Linux >  >> Linux

pthreads mutex vs semaphore

mutex digunakan untuk menghindari kondisi balapan antara banyak utas.

sedangkan semafor digunakan sebagai elemen sinkronisasi yang digunakan di beberapa proses.

mutex tidak dapat diganti dengan semafor biner karena, satu proses menunggu semafor sementara proses lainnya melepaskan semafor. Jika mutex, akuisisi dan rilis ditangani dengan cara yang sama.


Saya akan berbicara tentang Mutex vs Binary-Semaphore. Anda jelas menggunakan mutex untuk mencegah data dalam satu utas diakses oleh utas lain secara bersamaan.

(Asumsikan bahwa Anda baru saja memanggil lock() dan sedang dalam proses mengakses data. Artinya, Anda tidak mengharapkan utas lain (atau contoh lain dari kode utas yang sama) untuk mengakses data yang sama yang dikunci oleh mutex yang sama. Artinya, jika itu adalah kode utas yang sama yang dieksekusi pada contoh utas yang berbeda, mengenai kunci, maka lock() harus memblokir aliran kontrol.)

Ini berlaku untuk utas yang menggunakan kode utas berbeda, yang juga mengakses data yang sama dan juga dikunci oleh mutex yang sama.

Dalam hal ini, Anda masih dalam proses mengakses data dan Anda dapat mengambil, katakanlah, 15 detik lagi untuk membuka kunci mutex (sehingga utas lain yang diblokir di kunci mutex akan membuka blokir dan memungkinkan kontrol untuk mengakses data).

Apakah Anda pernah mengizinkan utas lain untuk membuka kunci mutex yang sama, dan pada gilirannya, mengizinkan utas yang sudah menunggu (memblokir) di kunci mutex untuk membuka blokir dan mengakses data? (Semoga Anda mengerti apa yang saya katakan di sini.)

Sesuai definisi universal yang disepakati,

  • dengan “mutex” hal ini tidak dapat terjadi. Tidak ada utas lain yang dapat membuka penguncian utas Anda
  • dengan “binary-semaphore” ini bisa terjadi. Utas lainnya dapat membuka kunci di utas Anda

Jadi, jika Anda sangat berhati-hati dalam menggunakan binary-semaphore daripada mutex, maka Anda harus sangat berhati-hati dalam "mencakup" kunci dan membuka kunci, maksud saya, bahwa setiap aliran kontrol yang mengenai setiap kunci harus menekan panggilan buka kunci dan juga tidak boleh ada "buka kunci pertama", melainkan harus selalu "kunci pertama".


Contoh Toilet

Mutex:

Adalah kunci toilet. Satu orang dapat memiliki kunci - menempati toilet - pada saat itu. Setelah selesai, orang tersebut memberikan (membebaskan) kunci ke orang berikutnya dalam antrean.

"Mutex biasanya digunakan untuk membuat serial akses ke bagian kode peserta ulang yang tidak dapat dijalankan secara bersamaan oleh lebih dari satu utas. Objek mutex hanya memungkinkan satu utas masuk ke bagian yang dikontrol, memaksa utas lain yang mencoba mendapatkan akses ke bagian itu untuk menunggu sampai utas pertama keluar dari bagian itu."

(Mutex sebenarnya adalah semaphore dengan nilai 1.)

Semafor:

Apakah jumlah kunci toilet identik gratis. Misalnya, katakanlah kita memiliki empat toilet dengan kunci dan kunci yang identik. Hitungan semafor - hitungan kunci - disetel ke 4 di awal (keempat toilet gratis), kemudian nilai hitungan dikurangi saat orang masuk. Jika semua toilet penuh, mis. tidak ada kunci kosong yang tersisa, hitungan semaphore adalah 0. Sekarang, ketika eq. satu orang meninggalkan toilet, semafor dinaikkan menjadi 1 (satu kunci gratis), dan diberikan kepada orang berikutnya dalam antrean.

"Sebuah semafor membatasi jumlah pengguna simultan dari sumber daya bersama hingga jumlah maksimum. Utas dapat meminta akses ke sumber daya (mengurangi semafor), dan dapat menandakan bahwa mereka telah selesai menggunakan sumber daya (menambah semafor)."

Sumber


semafor memiliki penghitung yang disinkronkan dan mutex hanya biner (benar / salah).

Semafor sering digunakan sebagai mekanisme definitif untuk menjawab berapa banyak elemen sumber daya yang digunakan -- misalnya, objek yang mewakili n utas pekerja mungkin menggunakan semafor untuk menghitung berapa banyak utas pekerja yang tersedia.

Sebenarnya Anda bisa merepresentasikan semafor dengan INT yang disinkronkan oleh mutex.


Linux
  1. Perintah Unix Apa yang Dapat Digunakan Sebagai Semaphore/lock?

  2. Cara Menggunakan Contoh Kunci C Mutex untuk Sinkronisasi Utas Linux

  3. Apa perbedaan antara mutex dan bagian kritis?

  1. Bagaimana cara memulihkan semaphore ketika proses yang menurunkannya menjadi nol macet?

  2. pthreads mutex vs semaphore

  3. Saya ingin menunggu deskriptor file dan mutex, apa cara yang disarankan untuk melakukan ini?

  1. Bagaimana Linux menyelamatkan komputer yang lambat (dan planet ini)

  2. Memulai NetworkManager di Linux

  3. Mengapa spin lock pilihan yang baik di Linux Kernel Design daripada sesuatu yang lebih umum di kode userland, seperti semaphore atau mutex?