Karena saya sendiri agak bingung, saya mulai dengan mengklarifikasi beberapa konsep dalam pertanyaan.
Koleksi . Saya tidak melihat alasan untuk menghabiskan waktu dengan keras mendefinisikan apa arti "koleksi" ketika kita bisa bertanya apa yang terjadi pada struktur data secara umum. Struktur data menempati sepotong memori dan memiliki beberapa operasi yang dapat mengakses memori itu dan yang dapat diminta oleh pengguna . Pengguna ini mungkin prosesor yang berbeda atau hanya utas yang berbeda, itu bukan urusan kami. Yang penting adalah mereka dapat melakukan operasi secara paralel.
Bebas kunci . Herlihy dan Boss mengatakan bahwa struktur data bebas kunci ketika pengguna yang mogok tidak mencegah penggunaan lebih lanjut dari struktur data. Sebagai contoh, bayangkan seseorang menuangkan air ke prosesor yang ada di tengah-tengah memasukkan sebuah simpul dalam satu set yang diurutkan. Nah, jika prosesor lain mencoba nanti untuk memasukkan ke dalam set yang diurutkan, mereka harus berhasil. ( Sunting: Menurut definisi ini, itu adalah kasus bahwa jika struktur data menggunakan kunci maka itu tidak bebas kunci, tetapi itu bukan kasus bahwa jika struktur data tidak menggunakan kunci maka itu bebas kunci.)
Dengan definisi ini, saya pikir Herlihy dan Boss pada dasarnya mengatakan bahwa jawabannya adalah mengubah daerah kritis menjadi transaksi.
Tetapi, Anda mungkin bertanya, apakah ini memiliki kompleksitas yang sama? Saya tidak yakin pertanyaannya masuk akal. Pertimbangkan push(x) { lock(); stack[size++] = x; unlock(); }
. Apakah ini operasi waktu yang konstan? Jika Anda mengabaikan operasi penguncian dan karenanya pengguna lain maka Anda dapat menjawab YA. Jika Anda tidak ingin mengabaikan pengguna lain, maka benar-benar tidak ada cara untuk mengatakan apakah push akan berjalan dalam waktu yang konstan. Jika Anda naik satu tingkat dan melihat bagaimana tumpukan digunakan oleh beberapa algoritma tertentu, maka Anda mungkin dapat mengatakan bahwa push akan selalu membutuhkan waktu yang konstan (diukur sekarang dalam hal apa pun yang terjadi menjadi input dari algoritma paralel Anda). Tapi itu benar-benar properti dari algoritma Anda, jadi tidak masuk akal untuk mengatakan bahwa push adalah operasi waktu yang konstan.
Singkatnya, jika Anda mengabaikan seberapa banyak pengguna yang menjalankan operasi menunggu pengguna lain, maka menggunakan transaksi alih-alih wilayah kritis menjawab pertanyaan Anda dengan tegas. Jika Anda tidak mengabaikan waktu tunggu, maka Anda perlu melihat bagaimana struktur data digunakan.