Trong khi tôi quen thuộc với các khái niệm lập trình đồng thời như mutexes và semaphores, tôi chưa bao giờ hiểu cách chúng được triển khai ở cấp độ ngôn ngữ assembly.Đồng bộ hóa chuỗi được triển khai như thế nào, ở cấp độ ngôn ngữ lắp ráp?
Tôi tưởng tượng có là một tập hợp các bộ nhớ "cờ" nói:
- khóa A được tổ chức bởi thread 1
- khóa B được tổ chức bởi thread 3
- khóa C không được tổ chức bởi bất kỳ chủ đề
- vv
Nhưng cách truy cập vào các cờ này được đồng bộ hóa giữa các chuỗi? Một cái gì đó giống như ví dụ ngây thơ này sẽ chỉ tạo ra một tình trạng chủng tộc:
mov edx, [myThreadId]
wait:
cmp [lock], 0
jne wait
mov [lock], edx
; I wanted an exclusive lock but the above
; three instructions are not an atomic operation :(
Để mở rộng này, CAS và các hoạt động tương tự là được sử dụng để thực hiện đồng bộ hóa vì CPU được thiết kế đặc biệt để có chúng hoạt động * nguyên tử * - chúng làm mọi thứ trong một bước, mà không có bất kỳ thao tác nào khác có thể làm gián đoạn chúng. – Amber
Lưu ý: Như ** John Knoeller ** đã chỉ ra, 'xchg' ngụ ý một * khóa * bắt đầu bằng 80386 - tiền tố được viết trong hầu hết các mẫu cho rõ ràng (mà tôi nghĩ là một thực hành tốt), không cần thiết . Điều này không đúng đối với những người khác - ví dụ: 'cmpxchg'.Vì vậy, tôi nghĩ rằng đó là cách an toàn nhất để luôn xác định rõ ràng tiền tố khi bạn định truy cập độc quyền vào bộ nhớ. –