Bisakah seseorang menjelaskan dengan sederhana apa itu pertentangan utas?
Saya telah mencarinya di Google, tetapi tidak dapat menemukan penjelasan sederhana.
multithreading
language-agnostic
Tony The Lion
sumber
sumber
Jawaban:
Intinya thread contention adalah suatu kondisi di mana satu thread menunggu kunci / objek yang sedang ditahan oleh thread lain. Oleh karena itu, utas tunggu ini tidak dapat menggunakan objek tersebut hingga utas lainnya telah membuka kunci objek tersebut.
sumber
Beberapa jawaban tampaknya berfokus pada pertengkaran kunci, tetapi gembok bukanlah satu-satunya sumber daya yang dapat dialami pertengkaran. Perselisihan adalah ketika dua utas mencoba mengakses sumber daya yang sama atau sumber daya terkait sedemikian rupa sehingga setidaknya salah satu utas bersaing berjalan lebih lambat daripada jika utas lainnya tidak berjalan.
Contoh pertengkaran yang paling jelas adalah tentang gembok. Jika utas A memiliki kunci dan utas B ingin mendapatkan kunci yang sama, utas B harus menunggu hingga utas A melepaskan kunci.
Sekarang, ini khusus platform, tetapi utas mungkin mengalami pelambatan meskipun tidak pernah harus menunggu utas lain melepaskan kuncinya! Ini karena kunci melindungi beberapa jenis data, dan data itu sendiri akan sering diperdebatkan juga.
Misalnya, pertimbangkan utas yang memperoleh kunci, memodifikasi objek, lalu melepaskan kunci dan melakukan beberapa hal lainnya. Jika dua utas melakukan ini, bahkan jika mereka tidak pernah memperebutkan kunci, utas mungkin berjalan jauh lebih lambat daripada jika hanya satu utas yang berjalan.
Mengapa? Katakanlah setiap utas berjalan pada intinya sendiri pada CPU x86 modern dan inti tidak berbagi cache L2. Dengan hanya satu utas, objek dapat tetap berada di cache L2 hampir sepanjang waktu. Dengan kedua utas berjalan, setiap kali satu utas memodifikasi objek, utas lainnya akan menemukan data tidak dalam cache L2-nya karena CPU lain membatalkan baris cache. Pada Pentium D, misalnya, ini akan menyebabkan kode berjalan pada kecepatan FSB, yang jauh lebih rendah dari kecepatan cache L2.
Karena perselisihan dapat terjadi bahkan jika gembok itu sendiri tidak diperebutkan, perselisihan juga dapat terjadi bila tidak ada gembok. Misalnya, CPU Anda mendukung penambahan atom dari variabel 32-bit. Jika satu utas terus menambah dan mengurangi variabel, variabel akan menjadi panas di cache hampir sepanjang waktu. Jika dua utas melakukannya, cache mereka akan memperebutkan kepemilikan memori yang menyimpan variabel itu, dan banyak akses akan lebih lambat karena protokol koherensi cache beroperasi untuk mengamankan setiap kepemilikan inti dari baris cache.
Ironisnya, gembok biasanya mengurangi pertengkaran. Mengapa? Karena tanpa kunci, dua utas dapat beroperasi pada objek atau koleksi yang sama dan menyebabkan banyak pertikaian (misalnya, ada antrian bebas kunci). Locks akan cenderung untuk membatalkan thread yang bersaing, memungkinkan thread yang tidak bersaing untuk dijalankan. Jika utas A memegang kunci dan utas B menginginkan kunci yang sama, implementasi dapat menjalankan utas C sebagai gantinya. Jika utas C tidak membutuhkan kunci itu, maka perselisihan di masa mendatang antara utas A dan B dapat dihindari untuk sementara. (Tentu saja, ini mengasumsikan ada utas lain yang dapat berjalan. Ini tidak akan membantu jika satu-satunya cara sistem secara keseluruhan dapat membuat kemajuan yang berguna adalah dengan menjalankan utas yang bersaing.)
sumber
Dari sini :
sumber
Saya pikir harus ada klarifikasi dari OP tentang latar belakang pertanyaan - saya dapat memikirkan 2 jawaban (meskipun saya yakin ada tambahan untuk daftar ini):
jika Anda mengacu pada "konsep" umum dari pertengkaran utas dan bagaimana hal itu dapat muncul dengan sendirinya dalam aplikasi, saya tunduk pada jawaban rinci @ DavidSchwartz di atas.
Ada juga Penghitung Kinerja '.NET CLR Locks and Threads: Total # of Contentions'. Seperti yang diambil dari deskripsi PerfMon untuk penghitung ini, itu didefinisikan sebagai:
... dan saya yakin orang lain untuk OS dan kerangka aplikasi lain.
sumber
Anda memiliki 2 utas. Thread A dan Thread B, Anda juga memiliki objek C.
A sedang mengakses objek C, dan telah mengunci objek tersebut. B perlu mengakses objek C, tetapi tidak dapat melakukannya hingga A melepaskan kunci pada objek C.
sumber
Kata lain mungkin konkurensi. Ini hanyalah gagasan tentang dua atau lebih utas yang mencoba menggunakan sumber daya yang sama.
sumber
Bagi saya perselisihan adalah kompetisi antara 2 atau lebih utas atas sumber daya bersama. Sumber daya dapat berupa kunci, penghitung, dll. Kompetisi berarti "siapa yang mendapatkan lebih dulu". Semakin banyak utas semakin banyak pertikaian. Semakin sering akses ke sumber daya semakin banyak pertengkaran.
sumber
Seperti pada contoh, kedua kasus tersebut memberi makna persaingan.
sumber
Pertentangan utas juga dipengaruhi oleh operasi I / O. Contoh ketika Thread menunggu file dibaca dapat dianggap sebagai pertengkaran. Gunakan port penyelesaian I / O sebagai solusi.
sumber
dari dokumentasi dotTrace
sumber