Trong giấy với tiêu đề giống như của câu hỏi này, các tác giả mô tả làm thế nào để xây dựng một nonblocking linearizable nhiều từ CAS hoạt động chỉ sử dụng một CAS đơn từ. Trước tiên, họ giới thiệu hoạt động trao đổi đơn so sánh kép - RDCSS, như sau:
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);
}
trong đó RDCSSDescriptor_t
cấu trúc với các trường sau:
a1
- địa chỉ của điều kiện đầu tiêno1
- giá trị dự kiến tại địa chỉ đầu tiêna2
- địa chỉ của điều kiện thứ haio2
- giá trị dự kiến tại địa chỉ thứ hain2
- giá trị mới được ghi tại địa chỉ thứ hai
Bộ mô tả này được tạo và khởi tạo một lần trong một luồng bắt đầu hoạt động RDCSS - không có luồng nào khác có tham chiếu đến nó cho đến khi CAS1 đầu tiên trong hàm RDCSS
thành công, làm cho bộ mô tả có thể truy cập được (hoặc hoạt động theo thuật ngữ của bài báo).
Ý tưởng đằng sau thuật toán là như sau - thay thế vị trí bộ nhớ thứ hai bằng một mô tả cho biết bạn muốn làm gì. Sau đó, cho rằng bộ mô tả có mặt, kiểm tra vị trí bộ nhớ đầu tiên để xem giá trị của nó có thay đổi không. Nếu không, thay thế bộ mô tả ở vị trí bộ nhớ thứ hai bằng giá trị mới. Nếu không, hãy đặt vị trí bộ nhớ thứ hai trở về giá trị cũ.
Các tác giả không giải thích tại sao dòng với !!
nhận xét là cần thiết trong bài báo. Dường như với tôi rằng các CAS1
hướng dẫn trong Complete
chức năng sẽ luôn thất bại sau lần kiểm tra này, miễn là không có sửa đổi đồng thời. Và nếu có một sửa đổi đồng thời giữa kiểm tra và CAS trong Complete
, thì luồng thực hiện kiểm tra vẫn không thành công với CAS của nó Complete
, vì sửa đổi đồng thời không nên sử dụng cùng một mô tả d
.
Câu hỏi của tôi là: Có thể bỏ qua việc kiểm tra chức năng RDCSSS
, if (r == d->o2)...
với RDCSS vẫn duy trì ngữ nghĩa của một so sánh kép, lệnh hoán đổi đơn có thể tuyến tính hóa và không khóa ? (dòng có !!
bình luận)
Nếu không, bạn có thể mô tả kịch bản mà dòng này thực sự cần thiết để đảm bảo tính chính xác?
Cảm ơn bạn.