Hãy tưởng tượng bạn đang viết đơn đăng ký ngân hàng và đơn đăng ký của bạn có yêu cầu rút 10 bảng Anh (có, tôi là tiếng Anh;)) từ tài khoản. Vì vậy, bạn cần phải đọc số dư tài khoản hiện tại vào một biến địa phương, trừ rút tiền và sau đó viết số dư trở lại bộ nhớ.
Tuy nhiên, nếu khác, yêu cầu đồng thời xảy ra giữa bạn đọc giá trị và bạn viết nó ra sao? Có khả năng kết quả của yêu cầu đó sẽ bị ghi đè hoàn toàn bởi lần đầu tiên và số dư tài khoản sẽ không chính xác.
Kiểm tra và đặt sẽ giúp chúng tôi khắc phục sự cố đó bằng cách kiểm tra xem giá trị ghi đè của bạn có phải là giá trị bạn nghĩ không. Trong trường hợp này, bạn có thể kiểm tra số dư là giá trị ban đầu mà bạn đã đọc. Vì nó là nguyên tử, nó không bị gián đoạn nên không ai có thể kéo tấm thảm ra từ dưới bạn giữa đọc và viết.
Một cách khác để khắc phục sự cố tương tự là lấy ra một khóa trên vị trí bộ nhớ. Thật không may, ổ khóa là rất khó khăn để có được quyền, khó có lý do về, có vấn đề khả năng mở rộng và hành xử xấu khi đối mặt với thất bại, vì vậy họ không phải là một giải pháp lý tưởng (nhưng chắc chắn thực tế). Các phương pháp thử nghiệm và thiết lập tạo thành cơ sở của một số Kỷ niệm Giao dịch Phần mềm, cho phép mọi giao dịch thực hiện đồng thời một cách lạc quan, với chi phí cho việc chuyển chúng trở lại nếu chúng xung đột.
+1 Bạn vừa giúp tôi giải quyết vấn đề tôi đang làm. –
@ jason-cohen: Đó thực sự là mô tả về [So sánh và hoán đổi] (https://en.wikipedia.org/wiki/Compare-and-swap). Kiểm tra và thiết lập thường chỉ liên quan đến các giá trị 0 và 1. Phần ** set ** đề cập đến việc thiết lập giá trị tại vị trí bộ nhớ được chỉ định đến 1. Nó trả về giá trị trước đó, hoặc là 1 hoặc 0, và thực hiện tất cả điều này trong một hoạt động nguyên tử duy nhất. –
@GregSlepak là chính xác, đây là compare_and_swap. test_and_set() lấy một con trỏ boolean đến một đích, đặt nó thành TRUE và trả về giá trị ban đầu của con trỏ. Nếu giá trị trả về của test_and_set (& lock) (tức là giá trị ban đầu của & khóa) là đúng, thì chúng tôi nhập phần quan trọng. – mateor