Jadual Kandungan
Perbezaan antara mutex dan semaphore
Mutex (Mutex)
Semaphore
Rumah masalah biasa Apakah perbezaan antara semaphore dan mutex

Apakah perbezaan antara semaphore dan mutex

Nov 08, 2021 pm 02:24 PM
mutex Jumlah isyarat benang

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.

Apakah perbezaan antara semaphore dan mutex

Persekitaran pengendalian tutorial ini: sistem Windows 7, komputer Dell G3.

Perbezaan antara mutex dan semaphore

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 (Mutex)

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.

Apakah perbezaan antara semaphore dan mutex

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

Solaris

创建

CreateMutex

pthread_mutex_init

mutex_init

加锁

WaitForSingleObject

pthread_mutex_lock

mutex_lock

解锁

ReleaseMutex

pthread_mutex_unlock

mutex_unlock

销毁

CloseHandle

pthread_mutex_destroy

mutex_destroy

Tindakan/Sistem
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

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.

Win32

动作/系统

Win32

POSIX

创建

CreateSemaphore

sem_init

等待

WaitForSingleObject

sem _wait

释放

ReleaseMutex

sem _post

试图等待

WaitForSingleObject

sem _trywait

销毁

CloseHandle

sem_destroy

Tindakan/Sistem

POSIX
Buat CreateSemaphore sem_init
Tunggu WaitForSingleObject sem _tunggu
lepaskan ReleaseMutex sem _post
cuba Tunggu WaitForSingleObject sem _trywait
Memusnahkan CloseHandle sem_destroy
Untuk lebih banyak pengetahuan berkaitan, sila lawati lajur Soalan Lazim!

Atas ialah kandungan terperinci Apakah perbezaan antara semaphore dan mutex. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah maksud 8 teras dan 16 utas? Apakah maksud 8 teras dan 16 utas? Feb 02, 2023 am 11:26 AM

8-teras bermakna CPU mempunyai 8 teras fizikal, dan 16-benang bermakna CPU boleh mempunyai sehingga 16 utas pemprosesan tugasan pada masa yang sama. Bilangan teras dan utas adalah penunjuk prestasi penting CPU komputer Semakin tinggi bilangan teras CPU, semakin tinggi kelajuan pemprosesan semakin banyak bilangan utas, semakin kondusif untuk menjalankan berbilang program pada masa yang sama; kerana bilangan utas adalah bersamaan dengan bilangan kali CPU boleh berjalan pada masa yang sama pada masa tertentu Bilangan tugasan yang perlu diproses secara selari. Multi-threading boleh memaksimumkan isu luas, pemprosesan superskalar tertib, meningkatkan penggunaan komponen pengkomputeran pemproses, dan mengurangkan kelewatan akses memori yang disebabkan oleh korelasi data atau kehilangan cache.

Amalan terbaik untuk mutex dalam program PHP Amalan terbaik untuk mutex dalam program PHP Jun 07, 2023 pm 12:40 PM

Dengan kemajuan zaman dan pengemaskinian teknologi yang berterusan, permintaan untuk aplikasi Web semakin meningkat, dan program PHP telah menjadi salah satu bahasa pengaturcaraan utama untuk banyak aplikasi Web. Dalam aplikasi web berbilang benang, keadaan konkurensi dan perlumbaan mesti diambil kira untuk memastikan program berjalan dengan betul. Dalam program PHP, mutex menyediakan penyelesaian untuk memastikan keselamatan benang dan ketepatan pemindahan data. Dalam artikel ini, kami akan meneroka amalan terbaik mutex dalam program PHP. Apakah mutex? Mutex digunakan untuk memastikan bahawa benang

Pengaturcaraan Serentak C++: Bagaimana untuk mengelakkan kebuluran benang dan penyongsangan keutamaan? Pengaturcaraan Serentak C++: Bagaimana untuk mengelakkan kebuluran benang dan penyongsangan keutamaan? May 06, 2024 pm 05:27 PM

Untuk mengelakkan kebuluran benang, anda boleh menggunakan kunci yang adil untuk memastikan peruntukan sumber yang adil, atau menetapkan keutamaan benang. Untuk menyelesaikan penyongsangan keutamaan, anda boleh menggunakan warisan keutamaan, yang meningkatkan keutamaan utas yang memegang sumber buat sementara waktu atau menggunakan promosi kunci, yang meningkatkan keutamaan utas yang memerlukan sumber.

Pengaturcaraan Serentak C++: Bagaimana untuk melakukan penamatan dan pembatalan benang? Pengaturcaraan Serentak C++: Bagaimana untuk melakukan penamatan dan pembatalan benang? May 06, 2024 pm 02:12 PM

Mekanisme penamatan dan pembatalan utas dalam C++ termasuk: Penamatan utas: std::thread::join() menyekat utas semasa sehingga utas sasaran menyelesaikan pelaksanaan std::thread::detach() menanggalkan utas sasaran daripada pengurusan utas. Pembatalan utas: std::thread::request_termination() meminta utas sasaran untuk menamatkan pelaksanaan; benang. Dalam pertempuran sebenar, request_termination() membenarkan utas untuk menentukan masa penamatan, dan join() memastikan bahawa pada baris utama

Apakah unit aliran arahan terkecil semasa program dijalankan? Apakah unit aliran arahan terkecil semasa program dijalankan? Aug 23, 2022 pm 02:16 PM

"Benang" ialah unit aliran arahan terkecil apabila program sedang berjalan. Proses merujuk kepada program dengan fungsi bebas tertentu, dan utas adalah sebahagian daripada proses, menerangkan status pelaksanaan aliran arahan adalah unit terkecil aliran pelaksanaan arahan dalam proses, dan merupakan unit asas penjadualan CPU. Benang adalah proses pelaksanaan tugas (segmen program); benang tidak menduduki ruang memori, ia termasuk dalam ruang memori proses. Dalam proses yang sama, beberapa utas berkongsi sumber proses;

Ralat Java: Ralat tersangkut benang JavaFX, cara menangani dan mengelakkannya Ralat Java: Ralat tersangkut benang JavaFX, cara menangani dan mengelakkannya Jun 24, 2023 pm 05:52 PM

Semasa pembangunan aplikasi JavaFX, kami sering menghadapi ralat tersekat benang JavaFX. Ralat sedemikian berbeza dalam keterukan dan boleh menjejaskan kestabilan dan prestasi program. Untuk memastikan operasi normal atur cara, kita perlu memahami punca dan penyelesaian ralat tersangkut benang JavaFX, dan cara untuk mengelakkan ralat ini daripada berlaku. 1. Punca ralat tersangkut benang JavaFX JavaFX ialah rangka kerja aplikasi UI berbilang benang, yang membolehkan program dilaksanakan untuk masa yang lama dalam utas latar belakang.

Apakah perbezaan antara coroutine dan utas dalam bahasa go Apakah perbezaan antara coroutine dan utas dalam bahasa go Feb 02, 2023 pm 06:10 PM

Perbezaan: 1. Benang boleh mempunyai berbilang coroutine, dan satu proses juga boleh mempunyai berbilang coroutine sahaja ; 4. Benang adalah preemptif, manakala coroutine bukan preemptif 5. Benang dibahagikan sumber CPU, dan coroutine adalah proses kod yang teratur.

Analisis perbezaan antara urutan dan proses dalam bahasa Go Analisis perbezaan antara urutan dan proses dalam bahasa Go Apr 03, 2024 pm 01:39 PM

Proses dan urutan dalam bahasa Go: Proses: contoh program yang dijalankan secara bebas dengan sumber dan ruang alamatnya sendiri. Thread: Unit pelaksanaan dalam proses yang berkongsi sumber proses dan ruang alamat. Ciri-ciri: Proses: overhed tinggi, pengasingan yang baik, penjadualan bebas. Thread: overhed rendah, sumber dikongsi, penjadualan dalaman. Kes praktikal: Proses: Mengasingkan tugasan yang telah lama berjalan. Thread: Memproses sejumlah besar data secara serentak.