Dalam makalah dengan judul yang sama dengan pertanyaan ini, penulis menggambarkan bagaimana membangun operasi CAS multi-kata linearizable nonblocking hanya menggunakan CAS kata tunggal. Mereka pertama kali memperkenalkan operasi penukaran ganda-bandingkan-tunggal - RDCSS, sebagai berikut:
word_t RDCSS(RDCSSDescriptor_t *d) {
do {
r = CAS1(d->a2, d->o2, d);
if (IsDescriptor(r)) Complete(r);
} while (IsDescriptor(r));
if (r == d->o2) Complete(d); // !!
return r;
}
void Complete(RDCSSDescriptor_t *d) {
v = *(d->a1);
if (v == d->o1) CAS1(d->a2, d, d->n2);
else CAS1(d->a2, d, d->o2);
}
di mana RDCSSDescriptor_t
adalah struktur dengan bidang-bidang berikut:
a1
- alamat kondisi pertamao1
- nilai yang diharapkan di alamat pertamaa2
- alamat kondisi keduao2
- nilai yang diharapkan di alamat keduan2
- nilai baru yang akan ditulis di alamat kedua
Deskriptor ini dibuat dan diinisialisasi sekali dalam utas yang memulai operasi RDCSS - tidak ada utas lain yang memiliki referensi sampai CAS1 pertama dalam fungsi RDCSS
berhasil, membuat deskriptor dapat dijangkau (atau aktif dalam terminologi makalah ini).
Gagasan di balik algoritma adalah sebagai berikut - ganti lokasi memori kedua dengan deskriptor yang mengatakan apa yang ingin Anda lakukan. Kemudian, mengingat bahwa deskriptor hadir, periksa lokasi memori pertama untuk melihat apakah nilainya berubah. Jika belum, ganti deskriptor di lokasi memori kedua dengan nilai baru. Jika tidak, atur lokasi memori kedua kembali ke nilai lama.
Para penulis tidak menjelaskan mengapa garis dengan !!
komentar itu perlu dalam makalah. Tampak bagi saya bahwa CAS1
instruksi dalam Complete
fungsi akan selalu gagal setelah pemeriksaan ini, asalkan tidak ada modifikasi bersamaan. Dan jika ada modifikasi bersamaan antara cek dan CAS di Complete
, maka utas yang melakukan pemeriksaan harus tetap gagal dengan CAS-nya Complete
, karena modifikasi bersamaan tidak boleh menggunakan deskriptor yang sama d
.
Pertanyaan saya adalah: Dapatkah pemeriksaan dalam fungsi RDCSSS
, if (r == d->o2)...
dihilangkan, dengan RDCSS masih mempertahankan semantik dari instruksi pembandingan ganda, pertukaran tunggal yang linierisasi dan bebas kunci ? (baris dengan !!
komentar)
Jika tidak, dapatkah Anda menggambarkan skenario di mana garis ini sebenarnya diperlukan untuk memastikan kebenaran?
Terima kasih.