에서 종이 이 질문과 동일한 제목, 저자는 구축하는 방법에 대해 설명 블로킹 선형화 여러 단어 CAS의 단 하나의 단어 CAS를 사용하여 작업을. 먼저 다음과 같이 이중 비교 단일 스왑 작업 인 RDCSS를 소개합니다.
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);
}
여기서는 RDCSSDescriptor_t
다음 필드가있는 구조입니다.
a1
-첫 번째 조건의 주소o1
-첫 번째 주소에서 예상되는 값a2
-두 번째 조건의 주소o2
-두 번째 주소에서 예상되는 값n2
-두 번째 주소에 쓰여질 새로운 값
이 디스크립터는 RDCSS 조작을 시작하는 스레드에서 한 번 작성되고 초기화됩니다. 함수의 첫 번째 CAS1이 RDCSS
성공할 때까지 다른 스레드가 해당 스레드에 대한 참조를 갖지 않아 디스크립터에 도달 할 수있게합니다 (또는 논문의 용어에서 활성 상태 ).
알고리즘의 기본 개념은 다음과 같습니다. 두 번째 메모리 위치를 수행하려는 작업을 나타내는 설명 자로 바꿉니다. 그런 다음 설명자가 존재하는 경우 첫 번째 메모리 위치를 확인하여 값이 변경되었는지 확인하십시오. 그렇지 않은 경우 두 번째 메모리 위치의 설명자를 새 값으로 바꾸십시오. 그렇지 않으면 두 번째 메모리 위치를 이전 값으로 다시 설정하십시오.
저자는 !!
논문 내에서 주석이 있는 줄이 왜 필요한지 설명하지 않습니다 . 동시 수정이 없으면이 검사 후 함수 의 CAS1
명령어 Complete
가 항상 실패하는 것 같습니다. 그리고 검사와 CAS 사이에 동시 수정이있는 경우 동시 수정은 동일한 디스크립터를 사용하지 않아야하므로 Complete
검사를 수행하는 스레드가 해당 CAS에서 실패 Complete
합니다 d
.
내 질문이있다 : 함수의 검사 수 RDCSSS
, if (r == d->o2)...
RDCSS는 여전히 이중 비교, 하나의 스왑 명령의 의미를 유지하면서, 생략 선형화 및 잠금 무료 ? ( !!
의견이있는 줄 )
그렇지 않은 경우 정확성을 보장하기 위해이 줄이 실제로 필요한 시나리오를 설명 할 수 있습니까?
감사합니다.