Setidaknya di C ++, saya menganggap thread-safe sebagai sedikit keliru karena meninggalkan banyak nama. Agar aman utas, kode biasanya harus proaktif tentangnya. Ini umumnya bukan kualitas pasif.
Agar suatu kelas aman dari tapak, ia harus memiliki fitur "ekstra" yang menambahkan overhead. Fitur-fitur ini adalah bagian dari implementasi kelas dan secara umum, tersembunyi dari antarmuka. Yaitu, utas berbeda dapat mengakses anggota kelas mana pun tanpa harus khawatir tentang pertentangan dengan akses bersamaan oleh utas berbeda DAN dapat melakukannya dengan cara yang sangat malas, menggunakan gaya pengkodean manusia biasa yang biasa, tanpa harus melakukan semua hal sinkronisasi gila yang sudah dimasukkan ke dalam isi kode yang dipanggil.
Dan inilah mengapa sebagian orang lebih suka menggunakan istilah yang disinkronkan secara internal .
Set Terminologi
Ada tiga set terminologi utama untuk ide-ide ini yang saya temui. Yang pertama dan secara historis lebih populer (tetapi lebih buruk) adalah:
- benang aman
- bukan utas yang aman
Yang kedua (dan lebih baik) adalah:
- bukti utas
- thread yang kompatibel
- utas permusuhan
Yang ketiga adalah:
- disinkronkan secara internal
- disinkronkan secara eksternal
- tidak dapat disinkronkan
Analogi
utas aman ~ utas bukti ~ disinkronkan secara internal
Contoh dari sistem yang disinkronkan secara internal (alias thread-safe atau thread proof ) adalah restoran tempat tuan rumah menyambut Anda di pintu, dan melarang Anda mengantri. Tuan rumah adalah bagian dari mekanisme restoran untuk berurusan dengan banyak pelanggan, dan dapat menggunakan beberapa trik yang agak rumit untuk mengoptimalkan tempat duduk pelanggan yang menunggu, seperti mempertimbangkan ukuran pesta mereka, atau berapa banyak waktu yang mereka miliki. , atau bahkan mengambil reservasi melalui telepon. Restoran disinkronkan secara internal karena semua ini adalah bagian dari antarmuka untuk berinteraksi dengannya.
bukan thread-safe (tapi bagus) ~ thread yang kompatibel ~ disinkronkan secara eksternal ~ free-threaded
Misalkan Anda pergi ke bank. Ada garis, yaitu pertentangan untuk teller bank. Karena Anda bukan orang biadab, Anda menyadari bahwa hal terbaik yang harus dilakukan di tengah pertengkaran untuk sumber daya adalah mengantri seperti makhluk beradab. Tidak ada yang secara teknis membuat Anda melakukan ini. Kami harap Anda memiliki pemrograman sosial yang diperlukan untuk melakukannya sendiri. Dalam hal ini, lobi bank disinkronkan secara eksternal. Haruskah kita mengatakan bahwa itu tidak aman? itulah yang implikasinya adalah jika Anda pergi dengan benang-aman , benang-aman bipolar set terminologi. Itu bukan istilah yang sangat baik. Terminologi yang lebih baik disinkronkan secara eksternal,Lobi bank tidak mudah diakses oleh banyak pelanggan, tetapi tidak melakukan sinkronisasi dengan mereka. Pelanggan melakukannya sendiri.
Ini juga disebut "utas gratis," di mana "bebas" seperti dalam "bebas dari kutu" - atau dalam hal ini, terkunci. Nah, lebih tepatnya, sinkronisasi primitif. Itu tidak berarti kode dapat berjalan di banyak utas tanpa primitif itu. Itu hanya berarti itu tidak datang dengan mereka sudah diinstal dan terserah Anda, pengguna kode, untuk menginstalnya sendiri sesuai keinginan Anda. Memasang primitif sinkronisasi Anda sendiri bisa jadi sulit dan membutuhkan pemikiran keras tentang kode, tetapi juga dapat mengarah pada program tercepat yang memungkinkan dengan menyesuaikan Anda dengan bagaimana program dijalankan pada CPU yang saat ini diretas.
bukan utas aman (dan buruk) ~ utas permusuhan ~ tidak dapat disinkronkan
Contoh analogi sehari-hari dari sistem benang-bermusuhan adalah beberapa brengsek dengan mobil sport yang menolak untuk menggunakan penutup mata mereka dan mengubah jalur mau tak mau. Gaya mengemudi mereka tidak bersahabat atau tidak dapat dipahami karena Anda tidak memiliki cara untuk berkoordinasi dengan mereka, dan ini dapat menyebabkan pertengkaran untuk jalur yang sama, tanpa resolusi, dan dengan demikian kecelakaan ketika dua mobil berusaha untuk menempati ruang yang sama, tanpa protokol apa pun untuk cegah ini. Pola ini juga dapat dianggap lebih luas sebagai anti-sosial, yang saya sukai karena kurang spesifik untuk utas dan lebih umum berlaku untuk banyak bidang pemrograman.
Mengapa thread safe et al. adalah set terminologi yang buruk
Set terminologi pertama dan tertua gagal membuat perbedaan yang lebih baik antara permusuhan thread dan kompatibilitas thread . Kompatibilitas thread lebih pasif daripada yang disebut safety thread, tetapi itu tidak berarti kode yang dipanggil tidak aman untuk penggunaan thread bersamaan. Itu hanya berarti pasif tentang sinkronisasi yang akan memungkinkan ini, menundanya ke kode panggilan, alih-alih menyediakannya sebagai bagian dari implementasi internal. Thread kompatibel adalah bagaimana kode mungkin harus ditulis secara default dalam banyak kasus, tetapi sayangnya ini juga sering keliru dianggap sebagai thread tidak aman, seolah-olah itu inheren anti keselamatan, yang merupakan titik utama kebingungan bagi para programmer.
CATATAN: Banyak manual perangkat lunak yang benar-benar menggunakan istilah "thread-safe" untuk merujuk pada "thread-kompatibel," menambahkan lebih banyak kebingungan pada apa yang sudah berantakan! Saya menghindari istilah "thread-safe" dan "thread-safe" di semua biaya karena alasan ini, karena beberapa sumber akan menyebut sesuatu "thread-safe" sementara yang lain akan menyebutnya "thread-safe" karena mereka tidak dapat setuju apakah Anda harus memenuhi beberapa standar ekstra untuk keselamatan (primitif sinkronisasi), atau TIDAK memusuhi dianggap "aman". Jadi hindari istilah-istilah itu dan gunakan istilah yang lebih cerdas, untuk menghindari miskomunikasi berbahaya dengan insinyur lain.
Pengingat tujuan kami
Pada dasarnya, tujuan kami adalah untuk menumbangkan kekacauan.
Kami melakukannya dengan menciptakan sistem deterministik yang dapat kami andalkan. Determinisme itu mahal, sebagian besar karena biaya peluang kehilangan paralelisme, pipelining, dan pemesanan ulang. Kami mencoba meminimalkan jumlah determinisme yang kami butuhkan untuk menjaga biaya tetap rendah, sambil menghindari pengambilan keputusan yang akan mengikis lebih sedikit determinisme yang kami mampu.
Sinkronisasi utas adalah tentang meningkatkan urutan dan mengurangi kekacauan. Tingkat di mana Anda melakukan ini sesuai dengan persyaratan yang disebutkan di atas. Level tertinggi berarti bahwa suatu sistem berperilaku dengan cara yang sepenuhnya dapat diprediksi setiap saat. Tingkat kedua berarti bahwa sistem berperilaku cukup baik sehingga kode panggilan dapat dengan andal mendeteksi ketidakpastian. Misalnya, bangun palsu dalam kondisi variabel atau kegagalan untuk mengunci mutex karena tidak siap. Tingkat ketiga berarti bahwa sistem tidak berperilaku cukup baik untuk bermain dengan orang lain dan hanya bisa PERNAH dijalankan dengan single-threaded tanpa menimbulkan kekacauan.