Saya ingin menjelaskan jalan buntu threading untuk pemula. Saya telah melihat banyak contoh kebuntuan di masa lalu, beberapa menggunakan kode dan beberapa menggunakan ilustrasi (seperti 4 mobil terkenal ). Ada juga masalah klasik yang mudah menemui jalan buntu seperti The Dining Philosophers , tetapi ini mungkin terlalu rumit untuk dipahami sepenuhnya oleh seorang pemula.
Saya mencari contoh kode paling sederhana untuk menggambarkan apa itu kebuntuan. Contohnya harus:
- Berhubungan dengan skenario pemrograman "nyata" yang masuk akal
- Bersikaplah sangat singkat, sederhana, dan terus terang
Apa yang kamu sarankan?
multithreading
language-agnostic
deadlock
Roee Adler
sumber
sumber
Jawaban:
Mungkin situasi bank yang sederhana.
Jelas, jika ada dua utas yang mencoba menjalankan transfer ( a, b ) dan transfer ( b, a ) pada saat yang sama, maka kebuntuan akan terjadi karena mereka mencoba memperoleh sumber daya dalam urutan terbalik.
Kode ini juga bagus untuk mencari solusi kebuntuan juga. Semoga ini membantu!
sumber
sync
bisa menjadi sesuatu seperti:sync(Account & a) { a.mutex.lock(); }
.Biarkan alam menjelaskan kebuntuan,
Kebuntuan: Katak vs. Ular
sumber
Berikut adalah contoh kode dari departemen ilmu komputer sebuah universitas di Taiwan yang menunjukkan contoh java sederhana dengan penguncian sumber daya. Itu sangat relevan bagi saya "kehidupan nyata". Kode di bawah ini:
sumber
Jika metode1 () dan metode2 () keduanya akan dipanggil oleh dua atau banyak utas, ada kemungkinan besar terjadi kebuntuan karena jika utas 1 memperoleh kunci pada objek String saat menjalankan metode1 () dan utas 2 memperoleh kunci pada objek Integer saat menjalankan metode2 () keduanya akan menunggu satu sama lain untuk melepaskan kunci pada Integer dan String untuk melangkah lebih jauh, yang tidak akan pernah terjadi.
sumber
Salah satu contoh kebuntuan sederhana yang saya temukan.
sumber
private int index
dilakukannya di sana?Berikut contoh sederhana di C ++ 11.
sumber
Silakan lihat jawaban saya untuk pertanyaan ini . Intinya setiap kali dua utas perlu memperoleh dua sumber daya yang berbeda, dan melakukannya dalam urutan yang berbeda maka Anda bisa mendapatkan jalan buntu.
sumber
Satu contoh yang dapat saya pikirkan adalah skenario Tabel, Senter, dan Baterai. Bayangkan sebuah senter dan sepasang baterai diletakkan di atas meja. Jika Anda berjalan ke meja ini dan mengambil baterai sementara orang lain memiliki senter, Anda berdua akan dipaksa untuk menatap satu sama lain dengan canggung sambil menunggu siapa yang akan meletakkan barang mereka kembali di atas meja. Ini adalah contoh kebuntuan. Anda dan orang tersebut sedang menunggu sumber daya tetapi tidak ada di antara Anda yang memberikan sumber daya mereka.
Demikian pula, dalam sebuah program, kebuntuan terjadi ketika dua atau lebih utas (Anda dan orang lain) menunggu dua atau lebih kunci (senter dan baterai) untuk dibebaskan dan keadaan dalam program sedemikian rupa sehingga kunci tersebut tidak pernah dibebaskan ( Anda berdua memiliki satu bagian dari teka-teki).
Jika Anda tahu java, beginilah cara Anda merepresentasikan masalah ini:
Jika Anda menjalankan contoh ini, Anda akan melihat bahwa terkadang segala sesuatunya berfungsi dengan baik dan benar. Tetapi terkadang program Anda tidak akan mencetak apa pun. Itu karena satu orang memiliki baterai sementara orang lain memiliki senter yang mencegah mereka menyalakan senter yang menyebabkan kebuntuan.
Contoh ini mirip dengan contoh yang diberikan oleh tutorial java: http://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html
Contoh lainnya adalah contoh loop:
Contoh ini dapat mencetak 'Belum selesai' berulang kali atau tidak pernah dapat mencetak 'Belum selesai' sama sekali. Yang pertama terjadi karena utas pertama memperoleh kunci kelas dan tidak pernah melepaskannya yang mencegah 'stopLoop' diakses oleh utas kedua. Dan yang terbaru terjadi karena utas kedua dimulai sebelum utas pertama menyebabkan variabel 'selesai' menjadi benar sebelum utas pertama dijalankan.
sumber
sumber
Saya menganggap masalah Dining Philosophers sebagai salah satu contoh yang lebih sederhana dalam menunjukkan kebuntuan, karena 4 persyaratan kebuntuan dapat dengan mudah diilustrasikan oleh gambar (terutama menunggu melingkar).
Saya menganggap contoh dunia nyata jauh lebih membingungkan bagi pemula, meskipun saya tidak dapat memikirkan skenario dunia nyata yang baik di luar kepala saya sekarang (saya relatif tidak berpengalaman dengan konkurensi dunia nyata).
sumber
Baru-baru ini saya menyadari bahwa perkelahian antar pasangan tidak lain adalah kebuntuan .. dimana biasanya salah satu proses harus crash untuk menyelesaikannya, tentu saja itu prioritas yang lebih rendah (Boy;)).
Berikut analoginya ...
Proses1: Gadis (G) Proses2: Laki-laki (B) Sumber1: Maaf Sumber2
: Menerima kesalahan sendiri
Kondisi yang Diperlukan:
1. Saling Mengecualikan: Hanya satu dari G atau B yang dapat meminta maaf atau menerima Kesalahan sendiri pada satu waktu.
2. Tahan dan Tunggu: Pada suatu waktu, yang satu menahan Maaf dan yang lain Menerima kesalahan sendiri, yang satu menunggu Menerima kesalahan sendiri untuk melepaskan maaf, dan yang lain menunggu maaf melepaskan menerima kesalahannya sendiri.
3. Tidak ada preemption: Bahkan Tuhan tidak bisa memaksa B atau G untuk melepaskan Maaf atau Menerima kesalahan sendiri. Dan secara sukarela? Apakah kamu bercanda??
4. Penantian Melingkar: Sekali lagi, yang menahan maaf menunggu yang lain menerima kesalahannya sendiri, dan yang memegang menerima kesalahannya sendiri ingin yang lain meminta maaf terlebih dahulu. Jadi itu melingkar.
Jadi kebuntuan terjadi ketika semua kondisi ini berlaku pada saat yang sama, dan itu selalu terjadi dalam perkelahian pasangan;)
Sumber: http://www.quora.com/Saurabh-Pandey-3/Posts/Never-ending-couple-fights-a-deadlock
sumber
Satu lagi contoh kebuntuan sederhana dengan dua sumber daya berbeda dan dua utas menunggu satu sama lain untuk melepaskan sumber daya. Langsung dari example.oreilly.com/jenut/Deadlock.java
sumber
If all goes as planned, deadlock will occur, and the program will never exit.
Bisakah kita membuat contoh ini menjadiguarantee
kebuntuan?Kebuntuan bisa terjadi dalam situasi ketika seorang
Girl1
ingin main mataGuy2
, yang ditangkap oleh orang lainGirl2
, danGirl2
ingin menggoda denganGuy1
yang tertangkapGirl1
. Pasalnya, kedua gadis tersebut menunggu untuk saling dumping, kondisi tersebut dinamakan deadlock.sumber
Masalah produsen-konsumen bersama dengan masalah para filsuf tempat makan mungkin sesederhana mungkin. Ini memiliki beberapa pseudocode yang mengilustrasikannya juga. Jika itu terlalu rumit untuk pemula, sebaiknya mereka berusaha lebih keras untuk memahaminya.
sumber
Pergi untuk skenario yang mungkin sederhana di mana kebuntuan dapat terjadi saat memperkenalkan konsep kepada siswa Anda. Ini akan melibatkan minimal dua utas dan minimal dua sumber daya (menurut saya). Tujuannya adalah untuk merekayasa skenario di mana utas pertama memiliki kunci pada sumber daya satu, dan menunggu kunci pada sumber daya dua dilepaskan, sementara pada saat yang sama utas dua memegang kunci pada sumber daya dua, dan sedang menunggu kunci sumber daya satu yang akan dirilis.
Tidak masalah apa sumber daya yang mendasarinya; demi kesederhanaan, Anda bisa menjadikannya sepasang file yang dapat ditulis oleh kedua utas.
EDIT: Ini mengasumsikan tidak ada komunikasi antar-proses selain kunci yang dipegang.
sumber
Agak sulit bagi saya untuk dipahami ketika membaca masalah para filsuf makan, IMHO kebuntuan sebenarnya terkait dengan alokasi sumber daya. Ingin berbagi contoh yang lebih sederhana di mana 2 Perawat harus berjuang untuk 3 peralatan untuk menyelesaikan tugas. Meskipun ditulis dalam bahasa java. Metode lock () sederhana dibuat untuk mensimulasikan bagaimana kebuntuan terjadi, sehingga dapat diterapkan dalam bahasa pemrograman lain juga. http://www.justexample.com/wp/example-of-deadlock/
sumber
Contoh sederhana dari https://docs.oracle.com/javase/tutorial/essential/concurrency/deadlock.html
Keluaran:
Thread Dump:
sumber
Inilah satu kebuntuan sederhana di Jawa. Kami membutuhkan dua sumber daya untuk menunjukkan kebuntuan. Dalam contoh di bawah ini, satu sumber daya adalah kunci kelas (melalui metode sinkronisasi) dan yang lainnya adalah bilangan bulat 'i'
sumber
sumber
Inilah kebuntuan sederhana di C #.
Jika, suatu hari, Anda memanggil ini dari utas GUI, dan utas lain memanggilnya juga - Anda mungkin menemui jalan buntu. Utas lainnya masuk ke EndInvoke, menunggu utas GUI mengeksekusi delegasi sambil menahan kunci. Utas GUI memblokir kunci yang sama menunggu utas lain melepaskannya - yang tidak akan terjadi karena utas GUI tidak akan pernah tersedia untuk mengeksekusi delegasi yang ditunggu utas lain. (tentu saja, kunci di sini tidak sepenuhnya diperlukan - begitu pula EndInvoke, tetapi dalam skenario yang sedikit lebih kompleks, kunci dapat diperoleh oleh pemanggil karena alasan lain, yang mengakibatkan kebuntuan yang sama.)
sumber
sumber
sumber
sumber
Saya telah membuat Contoh DeadLock Kerja yang sangat Sederhana: -
Dalam contoh di atas, 2 utas sedang menjalankan metode tersinkronisasi dari dua objek berbeda. Metode tersinkronisasiA dipanggil oleh objek threadDeadLockA dan metode tersinkronisasiB dipanggil oleh objek threadDeadLockB. Di methodA referensi threadDeadLockB diteruskan dan di methodB referensi threadDeadLockA diteruskan. Sekarang setiap utas mencoba mengunci objek lain. Dalam methodA, thread yang menahan kunci pada threadDeadLockA mencoba untuk mengunci objek threadDeadLockB dan demikian pula di methodB, thread yang menahan kunci pada threadDeadLockB mencoba untuk mengunci threadDeadLockA. Jadi kedua utas akan menunggu selamanya menciptakan kebuntuan.
sumber
Izinkan saya menjelaskan lebih jelas menggunakan contoh yang memiliki lebih dari 2 utas.
Misalkan Anda memiliki n utas yang masing-masing memegang kunci L1, L2, ..., Ln. Sekarang katakanlah, mulai dari utas 1, setiap utas mencoba mendapatkan kunci utas tetangganya. Jadi, utas 1 diblokir karena mencoba mendapatkan L2 (karena L2 dimiliki oleh utas 2), utas 2 diblokir untuk L3 dan seterusnya. Utas n diblokir untuk L1. Ini sekarang menjadi kebuntuan karena tidak ada utas yang dapat dieksekusi.
Dalam contoh di atas, Anda dapat melihat bahwa ada tiga utas yang memegang
Runnable
s task1, task2, dan task3. Sebelum pernyataansleep(100)
, utas memperoleh kunci tiga objek kerja ketika mereka memasukicall()
metode (karena adanyasynchronized
). Tapi begitu mereka mencoba kecallAnother()
objek thread tetangga mereka, mereka diblokir, menyebabkan kebuntuan, karena kunci objek tersebut telah diambil.sumber
sumber
Cara licik untuk menemui jalan buntu hanya dengan satu utas adalah mencoba mengunci mutex yang sama (non-rekursif) dua kali. Ini mungkin bukan contoh sederhana yang Anda cari, tetapi cukup yakin saya sudah menemukan kasus seperti itu.
sumber
Berikut adalah contoh detail saya untuk kebuntuan , setelah menghabiskan banyak waktu. Semoga membantu :)
sumber