Saya menggunakan pustaka struktur data bebas kunci Praktis sebelumnya. Mereka memiliki beberapa dukungan struktur data pohon bebas-kunci. Mungkin memiliki apa yang Anda cari.
Reza
Jawaban:
4
tidak membantu dalam dan dari dirinya sendiri. Dalam struktur data bebas-kunci, perlu ada instance atom tunggal ketika struktur data Anda tampaknya berubah. Semuainvarian representasiharus berlaku segera sebelum dan segera setelah instan atom itu.O ( 1 )
Ini berarti bahwa jika Anda melakukan modifikasi pada struktur data karakteristik penting adalah bahwa Anda dapat melakukan semua mod pada struktur data pribadi dan kemudian menukar modifikasi dalam instruksi atom tunggal.
Kunci-kebebasan biasanya paling mudah ketika struktur data Anda tidak dapat diubah ( berfungsi murni ). Anda cukup menyimpan pointer global ke versi saat ini dari struktur data. Pembaca tidak perlu mengunci apa pun. Modifikasi pada struktur data dilakukan dengan menukar penunjuk global ke satu struktur data yang tidak dapat diubah lainnya.
Misalnya: jika Anda memiliki pohon seimbang pohon murni fungsional Anda:
Rekam pointer global saat ini ke akar pohon.
Buat pohon baru yang menyisipkan atau menghapus simpul. (Ini adalah logaritmik dalam waktu dan ruang dalam jumlah node saat ini di pohon, dan melibatkan pembuatan node baru dari titik modifikasi hingga ke root, dan hanya menunjukkan segala sesuatu yang baru di bagian lama dari versi sebelumnya dari struktur data. )
Bandingkan dan tukarkan secara global pointer global ke root. (Perhatikan bahwa ini mungkin gagal jika modifikasi lain telah terjadi antara waktu Anda merekam pointer root lama dan sekarang. Jika ini terjadi, Anda kembali ke langkah 1 dan coba lagi. Ini disebut "kontrol konkurensi optimis.")
Perhatikan bahwa bagian terpenting adalah apa yang saya katakan di atas tentang perlunya mempertahankan invarian perwakilan. Biasanya tidak cukup untuk memiliki algoritma yang secara atomis membuat perubahan di tengah pohon. Mengapa? Misalnya: Anda mungkin memiliki utas pembaca yang sedang dalam proses melakukan preorder traversal dari pohon. Jika Anda memodifikasi sebuah simpul yang merupakan leluhur dari simpul yang sedang mereka baca maka Anda akan membatalkan prasyarat yang menurut mereka telah ditegakkan. Pembaca harus dapat bekerja dengan struktur data persis seperti sebelum Anda membuat perubahan, atau persis seperti yang akan terjadi setelah Anda membuat perubahan. Bukan sesuatu di antaranya.
Saya pikir teknik menunggu aktif, misalnya dengan membandingkan-dan-swap, biasanya disebut "bebas kunci" sehingga ada beberapa jalan keluar, bahkan dalam pengaturan yang bisa berubah.
Raphael
Saya tidak terbiasa dengan istilah menunggu aktif (dan Google tidak membantu). (Jika Anda berbicara tentang karya Kogan dan Petrank, itu menunjukkan cara mengubah algoritme bebas-kunci menjadi bebas-menunggu.) Saya menambahkan suntingan tentang bagaimana Anda dapat menangani ketidakmampuan untuk kebebasan kunci pada umumnya.
Pengembaraan Logika
Yang dimaksud dengan "menunggu aktif" adalah sesuatu seperti di while ( !P ) { noOp(); } doWork();mana noOpmungkin berada sleepatau serupa.
Raphael
Di bagian Edit , Anda menyebutkan teknik untuk membuat struktur data yang dapat diubah menjadi bebas kunci. Seperti yang ditunjukkan, kami menyalin seluruh struktur data, membuat mod ke salinan, dan kemudian menggunakan CAS primitive. Namun, bagaimana cara membuat Copylangkah atom? Tampaknya menjadi masalah sulit lainnya atomic snapshot.
hengxin
@ Hengxin: pikirkan primitif CAS sebagai operator "publikasikan". Sebelum struktur data diterbitkan, hanya utas yang melakukan modifikasi yang memiliki akses ke sana. Setelah struktur data diterbitkan, itu tidak berubah. Langkah penyalinan tidak perlu bersifat atomik karena satu-satunya hal yang dapat disalin oleh thread adalah versi yang diterbitkan, yang tidak dapat diubah. Jika dua utas secara bersamaan mencoba untuk bermutasi, keduanya menyalin struktur data yang tidak berubah yang sama, memodifikasi salinan lokal mereka, dan kemudian salah satu operasi CAS berhasil dan yang lainnya gagal. Yang gagal perlu menyalin dan memperbarui.
Jawaban:
tidak membantu dalam dan dari dirinya sendiri. Dalam struktur data bebas-kunci, perlu ada instance atom tunggal ketika struktur data Anda tampaknya berubah. Semuainvarian representasiharus berlaku segera sebelum dan segera setelah instan atom itu.O ( 1 )
Ini berarti bahwa jika Anda melakukan modifikasi pada struktur data karakteristik penting adalah bahwa Anda dapat melakukan semua mod pada struktur data pribadi dan kemudian menukar modifikasi dalam instruksi atom tunggal.
Kunci-kebebasan biasanya paling mudah ketika struktur data Anda tidak dapat diubah ( berfungsi murni ). Anda cukup menyimpan pointer global ke versi saat ini dari struktur data. Pembaca tidak perlu mengunci apa pun. Modifikasi pada struktur data dilakukan dengan menukar penunjuk global ke satu struktur data yang tidak dapat diubah lainnya.
Misalnya: jika Anda memiliki pohon seimbang pohon murni fungsional Anda:
Perhatikan bahwa bagian terpenting adalah apa yang saya katakan di atas tentang perlunya mempertahankan invarian perwakilan. Biasanya tidak cukup untuk memiliki algoritma yang secara atomis membuat perubahan di tengah pohon. Mengapa? Misalnya: Anda mungkin memiliki utas pembaca yang sedang dalam proses melakukan preorder traversal dari pohon. Jika Anda memodifikasi sebuah simpul yang merupakan leluhur dari simpul yang sedang mereka baca maka Anda akan membatalkan prasyarat yang menurut mereka telah ditegakkan. Pembaca harus dapat bekerja dengan struktur data persis seperti sebelum Anda membuat perubahan, atau persis seperti yang akan terjadi setelah Anda membuat perubahan. Bukan sesuatu di antaranya.
sumber
while ( !P ) { noOp(); } doWork();
mananoOp
mungkin beradasleep
atau serupa.Copy
langkah atom? Tampaknya menjadi masalah sulit lainnyaatomic snapshot
.