Để nắm bắt sự loại trừ lẫn nhau và quy tắc điều phối, biến thể hiện được tích hợp thêm
lock có kiểu Thread Int lưu trữ định danh của luồng sở hữu khóa, nếu có, cùng với số của các lời gọi đồng bộ trong chuỗi lời gọi của luồng sở hữu khóa. Giá trị ban đầu
của khóa free(null,0) biểu thị rằng khóa tự do. Các biến thể hiện wait và notified của kiểu listThread Int là tương đương với các tập wait và notified của các ngữ nghĩa và lưu trữ các luồng đang đợi ở một bộ điều phối, theo thứ tự các luồng được thông báo. Bên cạnh định danh luồng, số của các lời gọi đồng bộ cũng được lưu trữ. Nói cách khác, các biến này nhớ giá trị của khóa cũ trước khi tạm thời ngừng, giá trị này được trả lại khi luồng hoạt động trở lại. Tất cả các biến bổ trợ được khởi tạo một cách bình thường. Đối với các giá trị thread của kiểu Thread và wait của kiểu list (Thread Int), ta sẽ viết thread wait thay vì thread,nwait với các giá trị n.
Theo cú pháp, bên cạnh bổ sung được tích hợp của chương trước, quan sát được gọi ở điểm đầu và điểm cuối của mỗi thân phương thức được đồng bộ hóa thi hành theo thứ tự lock:inclockvà lock:declock. Các ngữ nghĩa của sự tăng khóa
, inst lock
inc là thread,n1 đối với instlock v,n. Chú ý rằng định danh của luồng sở hữu khóa không những trong trường hợp khóa tự do mà còn trong trường hợp nếu có một luồng đang sở hữu khóa. Tuy nhiên, bởi vì những cập nhật này được thi hành trong các phương thức được đồng bộ, nên các ngữ nghĩa đảm bảo cho trường hợp có một luồng đang sở hữu khóa, luồng sở hữu khóa là luồng đang thực thi, nghĩa là, nếu khóa không tự do thì thành phần luồng của khóa không được sửa đổi. Điều này có nghĩa là, tăng giá trị khóa ,n tạo ra ,n1, trong khi đó tăng một khóa tự do
null,0 bởi một luồng có kết quả là ,1. Giảm khóa declock được thực hiện ngược lại:
inst,
lock
dec với instlock ,n là , n1 nếu n > 1, và tự do nếu ngược lại.
Thay vì các câu lệnh phụ trợ của các ngữ nghĩa, thông báo được thể hiện trong hệ chứng minh dựa trên trạng thái bởi các phép gán phụ trợ trong các biến wait và
notified: Các câu lệnh phụ trợ !signal và !signal_all được thay thế bởi các phép gán phụ trợ. Các câu lệnh phụ trợ ?signal không được thể hiện. Điều này có nghĩa là, thông báo được thể hiện bởi duy nhất một phép gán phụ trợ được thi hành bởi luồng đưa ra thông báo. Đối với các luồng đang được thông báo, các điểm điều khiển trước và sau thông báo được mô tả bởi duy nhất một khẳng định trong phương thức wait.
Các điểm điều khiển khác có thể được phân biệt bởi các giá trị của các biến phụ trợ tích hợp wait và notified.
Vào phương thức wait nhận được quan sát wait,lock:wait lock,free trả về từ
notified threadnotified getnotified thread
get notified
lock, : , , \ , . Đối với một luồng
Thread
Val
và một danh sách listthread Int
Val
notified , getnotified, lấy giá trị
,n từ danh sách. Các ngữ nghĩa đảm bảo tính duy nhất của sự kết hợp. Câu lệnh
signal
! của phương thức notify được thay thế bằng lệnh gán bội phụ trợwait,notified:notifywait,notified, trong đó giá trị notifywait,notified là một cặp của các tập được cho với một phần tử được chọn, được chuyển từ tập tập wait sang tập
notified; nếu tập wait là rỗng, nó là định danh hàm. Cuối cùng, câu lệnh !signal_all
của phương thức notifyAll được thay thế bởi phép gán phụ trợ
,
:
,wait notified wait
notified .