Tôi đọc hướng dẫn sử dụng Intel và thấy có tiền tố khóa để được hướng dẫn, điều này có thể ngăn các bộ xử lý ghi vào cùng một vị trí bộ nhớ cùng một lúc. Tôi rất vui mừng về nó. Tôi đoán nó có thể được sử dụng như phần cứng mutex. Vì vậy, tôi đã viết một đoạn mã để có một bức ảnh. Kết quả là khá bực bội. Khóa không hỗ trợ hướng dẫn MOV hoặc LEA. Hướng dẫn cho biết LOCK chỉ hỗ trợ ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG, CMPXCH8B, DEC, INC, NEG, KHÔNG, HOẶC, SBB, SUB, XOR, XADD và XCHG. Hơn nữa, nếu tiền tố LOCK được sử dụng với một trong các hướng dẫn này và toán hạng nguồn là toán hạng bộ nhớ, một ngoại lệ opcode không xác định (#UD) có thể được tạo ra.Tiền tố LOCK của lệnh Intel. Điểm là gì?
Tôi tự hỏi tại sao rất nhiều hạn chế, vì vậy nhiều hạn chế làm cho LOCK có vẻ vô dụng. Tôi không thể sử dụng nó để đảm bảo một hoạt động viết chung không có dữ liệu bẩn hoặc các vấn đề khác gây ra bởi song song.
Ví dụ: Tôi đã viết mã ++ (* p) trong C. p là con trỏ đến một bộ nhớ chia sẻ. Việc lắp ráp tương ứng giống như:
movl 28(%esp), %eax
movl (%eax), %eax
leal 1(%eax), %edx
movl 28(%esp), %eax
movl %edx, (%eax)
tôi thêm "khóa" trước khi "movl" và "Leal", nhưng bộ vi xử lý phàn nàn "Hướng dẫn không hợp lệ". :-(Tôi đoán cách duy nhất để làm cho hoạt động viết được tuần tự hóa là sử dụng phần mềm mutex, phải không?
http://en.wikipedia.org/wiki/Fetch-and-add – Mysticial
http://en.wikipedia.org/wiki/Compare-and-swap – Mysticial
A 'movl' đến một địa chỉ liên kết luôn luôn là nguyên tử , do đó, khóa sẽ không tạo ra sự khác biệt nào cả. – hirschhornsalz