Gelen yazıda bu soruya aynıdır başlıkla, yazarlar nasıl oluşturulacağını açıklayan tıkanmasızdır lineerleşebilirdir çok kelimeli CAS sadece tek kelimelik CAS kullanarak işlemi. İlk önce çift karşılaştırma-tek değiştirme işlemini (RDCSS) aşağıdaki gibi tanıtırlar:
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);
}
burada RDCSSDescriptor_t
aşağıdaki alanlara sahip bir yapıdır:
a1
- ilk koşulun adresio1
- ilk adreste beklenen değera2
- ikinci koşulun adresio2
- ikinci adreste beklenen değern2
- ikinci adrese yazılacak yeni değer
Bu tanımlayıcı, RDCSS işlemini başlatan bir iş parçacığında bir kez oluşturulur ve başlatılır - işlevdeki ilk CAS1 RDCSS
başarılı olana kadar başka hiçbir iş parçacığının başvurusu yoktur , bu da tanımlayıcıya ulaşılabilir (veya kağıdın terminolojisinde etkin hale gelir ).
Algoritmanın arkasındaki fikir şudur - ikinci bellek konumunu, ne yapmak istediğinizi söyleyen bir tanımlayıcıyla değiştirin. Ardından, tanımlayıcının mevcut olduğu göz önüne alındığında, değerinin değişip değişmediğini görmek için ilk bellek konumunu kontrol edin. Yoksa, ikinci bellek konumundaki tanımlayıcıyı yeni değerle değiştirin. Aksi takdirde, ikinci bellek konumunu eski değerine ayarlayın.
Yazarlar, !!
yorumda yer alan çizginin makalede neden gerekli olduğunu açıklamamaktadır . Bana öyle geliyor ki, eşzamanlı bir değişiklik olmaması şartıyla CAS1
, Complete
işlevdeki talimatlar bu kontrolden sonra her zaman başarısız olacaktır. Ve kontrol ile CAS girişi arasında eşzamanlı bir değişiklik varsa Complete
, o zaman kontrolü yapan iş parçacığı CAS içeriğinde hala başarısız olmalıdır Complete
, çünkü eşzamanlı değişiklik aynı tanımlayıcıyı kullanmamalıdır d
.
Benim soru: işlevinde onay Can RDCSSS
, if (r == d->o2)...
RDCSS hala bir çift karşılaştırma, tek takas talimat semantiklerine ile atlanabilir lineerleşebilirdir ve kilidi serbest ? ( !!
yorum içeren satır )
Değilse, doğruluk sağlamak için bu çizginin gerçekten gerekli olduğu senaryoyu tanımlayabilir misiniz?
Teşekkür ederim.