Perbezaan: 1. Mutex digunakan untuk mengecualikan bersama benang, dan semaphore digunakan untuk penyegerakan benang; 2. Nilai Mutex hanya boleh 0 atau 1, dan nilai semaphore boleh menjadi bukan negatif; integer; 3. Mengunci dan membuka kunci mutex masing-masing mesti digunakan oleh benang yang sama.
Persekitaran pengendalian tutorial ini: sistem Windows 7, komputer Dell G3.
1. Mutex digunakan untuk mengecualikan bersama benang, dan semaphore digunakan untuk penyegerakan benang.
Ini ialah perbezaan asas antara mutex dan semaphore, iaitu perbezaan antara pengecualian bersama dan penyegerakan.
Keeksklusifan bersama: merujuk kepada sumber yang hanya membenarkan seorang pelawat mengaksesnya pada masa yang sama, dan unik serta eksklusif. Tetapi pengecualian bersama tidak boleh mengehadkan susunan pelawat mengakses sumber, iaitu, akses tidak tertib.
Penyegerakan: merujuk kepada akses teratur sumber oleh pelawat melalui mekanisme lain atas dasar pengecualian bersama (dalam kebanyakan kes). Dalam kebanyakan kes, penyegerakan sudah melaksanakan pengecualian bersama, terutamanya apabila semua penulisan kepada sumber mestilah saling eksklusif. Beberapa kes membenarkan berbilang pelawat mengakses sumber pada masa yang sama
2 Nilai mutex hanya boleh 0/1 dan nilai semaphore boleh menjadi integer bukan negatif.
Dalam erti kata lain, mutex hanya boleh digunakan untuk akses eksklusif bersama satu sumber dan ia tidak boleh melaksanakan pengecualian bersama berbilang benang bagi berbilang sumber. Semaphore boleh merealisasikan pengecualian bersama berbilang benang dan penyegerakan berbilang sumber yang serupa. Apabila semaphore ialah semaphore bernilai tunggal, akses yang saling eksklusif kepada sumber juga boleh diselesaikan.
3. Penguncian dan pembuka kunci mutex masing-masing mesti digunakan oleh benang yang sama.
Mutex ialah struktur data yang mewakili fenomena pengecualian bersama dan juga digunakan sebagai semafor binari. Mutex pada asasnya ialah isyarat perduaan sensitif berbilang tugas yang boleh digunakan untuk menyegerakkan gelagat berbilang tugasan Ia sering digunakan untuk melindungi bahagian kod kritikal daripada gangguan dan untuk berkongsi sumber yang digunakan dalam penyegerakan.
Mutex pada asasnya adalah kunci, menyediakan akses eksklusif kepada sumber, jadi peranan utama Mutex adalah untuk pengecualian bersama. Nilai objek Mutex hanya mempunyai dua nilai 0 dan 1. Kedua-dua nilai ini juga mewakili dua keadaan Mutex masing-masing. Nilainya ialah 0, yang menunjukkan keadaan penguncian Objek semasa dikunci Jika proses/benang pengguna cuba Mengunci sumber kritikal, ia akan memasuki baris gilir dan menunggu nilainya ialah 1, yang menunjukkan keadaan terbiar objek melahu, dan proses/benang pengguna boleh Mengunci sumber kritikal Selepas itu, nilai Mutex berkurangan sebanyak 1 dan menjadi 0.
Mutex boleh disarikan kepada empat operasi:
- CreateCreate
- Kunci
- Buka Kunci
- Destroy Destroy
Mutex boleh mempunyai nilai awal apabila ia dibuat, menunjukkan sama ada Mutex dikunci atau melahu selepas ia dibuat. Dalam urutan yang sama, untuk mengelakkan kebuntuan, sistem tidak membenarkan Mutex dikunci dua kali berturut-turut (sistem biasanya kembali serta-merta selepas panggilan kedua). Dalam erti kata lain, dua operasi yang sepadan iaitu mengunci dan membuka kunci perlu diselesaikan dalam urutan yang sama.
Fungsi Mutex disediakan dalam sistem pengendalian berbeza:
|
Win32 | Linyx td > | Solaris | ||||||||||||||||||||
Buat | CreateMutex | pthread_mutex_init | mutex_init | ||||||||||||||||||||
Kunci | WaitForSingleObject | pthread_mutex_lock | mutex_lock | ||||||||||||||||||||
Buka kunci | ReleaseMutex | pthread_mutex_unlock td> | mutex_unlock | ||||||||||||||||||||
musnahkan | CloseHandle | pthread_mutex_destroy | mutex_destroy td> |
Kebuntuan berlaku terutamanya apabila terdapat berbilang kunci bersandar, dan berlaku apabila satu utas cuba mengunci mutex dalam urutan yang bertentangan kerana cara mengelakkan kebuntuan adalah sesuatu yang perlu diberi perhatian khusus apabila menggunakan mutex.
Secara umumnya, terdapat beberapa prinsip asas tidak bertulis:
Anda mesti mendapatkan kunci sebelum mengendalikan sumber yang dikongsi.
Pastikan anda melepaskan kunci selepas menyelesaikan operasi.
Cuba untuk mengisi kunci untuk masa yang sesingkat mungkin.
Jika terdapat berbilang kunci, jika pesanan pemerolehan adalah kunci rantai ABC, perintah pelepasan juga harus ABC.
Apabila benang mengembalikan ralat, ia harus melepaskan kunci yang diperolehnya.
Mungkin ada pembaca yang tertanya-tanya, bagaimana untuk melaksanakan operasi "gantung menunggu" dan "benang menunggu bangun"? Setiap Mutex mempunyai baris gilir menunggu Jika benang ingin menunggu pada Mutex, ia mesti menambah dirinya pada baris gilir menunggu, kemudian menetapkan status urutan untuk tidur, dan kemudian memanggil fungsi penjadual untuk beralih ke urutan lain. Jika urutan ingin membangunkan urutan lain dalam baris gilir menunggu, ia hanya perlu mengeluarkan satu item daripada baris gilir menunggu, menukar statusnya daripada tidur kepada sedia dan menyertai baris gilir sedia, kemudian ia mungkin bertukar untuk dikejutkan seterusnya masa fungsi penjadual dilaksanakan.
Dalam keadaan biasa, jika benang yang sama memanggil kunci dua kali, semasa panggilan kedua, kerana kunci sudah diduduki, benang akan digantung menunggu benang lain melepaskan kunci benang diduduki dengan sendirinya, benang digantung tanpa peluang untuk melepaskan kunci, jadi ia sentiasa dalam keadaan menunggu yang digantung Ini dipanggil kebuntuan. Satu lagi situasi kebuntuan biasa ialah ini: Benang A memperoleh kunci 1, dan benang B memperoleh kunci 2. Pada masa ini, utas A memanggil kunci untuk cuba memperoleh kunci 2. Akibatnya, ia perlu digantung dan menunggu benang B dilepaskan kunci 2, dan ini Pada masa ini, benang B juga memanggil kunci untuk mencuba mendapatkan kunci 1. Akibatnya, ia perlu menunggu benang A melepaskan kunci 1, jadi kedua-dua benang A dan B berada dalam keadaan digantung selama-lamanya. Tidak sukar untuk membayangkan bahawa jika lebih banyak benang dan lebih banyak kunci terlibat, masalah kemungkinan kebuntuan akan menjadi rumit dan sukar untuk dinilai.
Semaphore, kadangkala dipanggil semaphore, ialah kemudahan yang digunakan dalam persekitaran berbilang benang Ia bertanggungjawab untuk menyelaraskan pelbagai utas menggunakan sumber awam dengan betul dan munasabah.
Semaphore boleh dibahagikan kepada beberapa kategori:
Semaphore binari: Hanya semaphore dibenarkan untuk mengambil nilai 0 atau 1, dan ia hanya boleh digunakan oleh satu pada masa yang sama Pemerolehan benang.
Semaphore integer: Nilai semaphore ialah integer, yang boleh diperolehi oleh berbilang benang pada masa yang sama sehingga nilai semaphore menjadi 0.
Rekod semaphore: Selain nilai integer (kiraan), setiap semaphore s juga mempunyai Senarai gilir menunggu, yang disekat pada semaphore Pengenalan setiap utas. Apabila semaphore dilepaskan dan nilainya dinaikkan dengan satu, sistem secara automatik membangunkan benang menunggu daripada baris gilir menunggu, membolehkan ia memperoleh semaphore, dan pada masa yang sama semaphore dikurangkan satu.
Semaphore mengawal akses kepada sumber yang dikongsi melalui pembilang Nilai semaphore ialah integer bukan negatif, dan semua utas yang melepasinya akan mengurangkan integer sebanyak satu. Jika kaunter lebih besar daripada 0, akses dibenarkan dan kaunter dikurangkan sebanyak 1 jika 0, akses adalah dilarang dan semua utas yang cuba melewatinya akan berada dalam keadaan menunggu.
Hasil pengiraan kaunter ialah pas yang membenarkan akses kepada sumber yang dikongsi. Oleh itu, untuk mengakses sumber yang dikongsi, benang mesti mendapat pas daripada semaphore Jika kiraan semaphore lebih daripada 0, maka utas ini mendapat pas, yang akan menyebabkan kiraan semaphore berkurangan akan menyekat sehingga mendapat pas sehingga. Apabila utas ini tidak lagi perlu mengakses sumber yang dikongsi, ia mengeluarkan pas, yang menyebabkan kiraan semaphore ditambah, dan jika utas lain sedang menunggu pas, utas itu akan mendapat pas pada masa itu.
Semaphore boleh disarikan kepada lima operasi:
- CreateCreate
-Tunggu:
The benang menunggu untuk semaphore Jika nilai lebih besar daripada 0, ia diperolehi dan nilainya dikurangkan dengan satu, jika ia hanya sama dengan 0, benang memasuki keadaan tidur sehingga nilai semaphore lebih besar daripada 0 atau masa keluar. .
-Siaran Keluaran
melaksanakan pelepasan semaphore, dan nilainya dinaikkan sebanyak satu; .
-Cuba tunggu TryWait
Jika TryWait dipanggil, benang sebenarnya tidak memperoleh semaphore, tetapi menyemak sama ada semaphore boleh diperolehi nilai lebih besar daripada 0, TryWait mengembalikan kejayaan;
-Memusnahkan
Semaphore boleh digunakan untuk melindungi dua atau lebih segmen kod kritikal ini tidak boleh dipanggil serentak. Sebelum memasuki bahagian kritikal kod, benang mesti mendapatkan semaphore. Jika tiada utas dalam bahagian kritikal kod, utas itu segera memasuki bahagian rajah blok tersebut. Setelah bahagian kritikal kod selesai, benang mesti melepaskan semaphore. Utas lain yang ingin memasuki bahagian kod kritikal ini mesti menunggu sehingga utas pertama mengeluarkan semafor. Untuk melengkapkan proses ini, anda perlu mencipta semaphore, dan kemudian letakkan Acquire Semaphore VI dan Release Semaphore VI pada permulaan dan akhir setiap segmen kod utama. Pastikan bahawa semaphore VI ini merujuk kepada semaphore yang dibuat pada asalnya.
|
Win32POSIX | ||||||||||||||||||
Buat | CreateSemaphore | sem_init | |||||||||||||||||
Tunggu | WaitForSingleObject | sem _tunggu | |||||||||||||||||
lepaskan | ReleaseMutex | sem _post | |||||||||||||||||
cuba Tunggu | WaitForSingleObject | sem _trywait | |||||||||||||||||
Memusnahkan | CloseHandle | sem_destroy |
Atas ialah kandungan terperinci Apakah perbezaan antara semaphore dan mutex. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!