Kết quả kiểm chứng ở hình 4.14 cho thấy tiến trình SUPERMARKET vi phạm thuộc tính an toàn. Như vậy thiết kế mà chúng ta đưa ra bị sai.
4.3.4. Hiệu chỉnh thiết kế và kiểm chứng lại
Kết quả kiểm chứng ở hình 4.14 cho biết rằng thiết kế hệ thống tương tranh của bài toán Supermarket vi phạm thuộc tính an toàn, ở đây chính là lỗi do việc hai luồng có thể đồng thời truy cập và viết cùng một giá trị lên biến chia sẽ. Để khắc phục lỗi này chúng ta hiệu chỉnh lại thiết kế nhằm đảm bảo rằng tại một thời điểm chỉ có duy nhất một luồng được phép truy cập và viết lên biến đối tượng chia sẽ, khi một luồng đang truy cập biến chia sẽ thì luồng khác phải chờ cho đến khi luồng này giải phóng tài nguyên mới được quyền truy cập.
Để thực hiện điều này chúng ta thực hiện hiểu chỉnh lại thiết kế bằng cách đưa thêm khóa vào và các luồng chỉ được phép truy cập vào tài nguyên dung chung khi có được khóa, đồng thời giải phóng nó sau khi kết thúc tiến trình. Những thay đổi ở thiết kế mới được miêu như tả sau.
- Bổ sung thêm một khóa được định nghĩa như một tiến trình LOCK như sau: LOCK = (acquire->release->LOCK)
Với acquire là hành động yêu cầu để có được khóa, và release là giải phóng khóa khi đã kết thúc tiến trình. LTS của tiến trình LOCK đươc miêu tả ở hình 2.3.
- Kết hợp tiến trình LOCK với tiến trình VAR để thay thế tiến trình VAR trong định nghĩa của SUPERMARKET. LTS của tiến trình LOCKVAR được miêu tả như hình 2.12.
||LOCKVAR = (LOCK || VAR).
-Bảng chữ cái VarAlpha được sửa đổi để tính đến các hành động thêm khóa vào: set VarAlpha = {value.{read[T],write[T], acquire, release}} - Đinh nghĩa TURNSTILE cũng được sửa đổi bằng cách thêm vào các hành
động acquire và release như chỉ ra ở hình 4.15, theo đó trước khi thực hiện việc đọc và ghi lên đối tượng chia sẽ thì TURNSTILE đòi hỏi phải nhận được khóa trước và thực hiện giải phóng khóa khi tiến trình kết thúc.