Phác thảo chứng minh 49

Một phần của tài liệu Luận văn:Phương pháp kiểm chứng tính đúng đắn của một chương trình Java đa luồng thông qua sử dụng logic Hoare potx (Trang 49 - 51)

Để 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 ThreadInt 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 waitnotified của kiểu listThreadInt là tương đương với các tập waitnotified 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 Threadwait của kiểu list (ThreadInt), ta sẽ viết threadwait thay vì thread,nwait 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:inclockvà lock:declock. Các ngữ nghĩa của sự tăng khóa

      , inst lock

inc là thread,n1 đố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 ,n1, 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à , n1 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

notified: Các câu lệnh phụ trợ !signal!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 waitnotified.

Vào phương thức wait nhận được quan sát wait,lock:wait lock,free trả về từ

notified threadnotifiedgetnotified 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ợ

 ,

: (adsbygoogle = window.adsbygoogle || []).push({});

,wait notified wait

notified  .

Một phần của tài liệu Luận văn:Phương pháp kiểm chứng tính đúng đắn của một chương trình Java đa luồng thông qua sử dụng logic Hoare potx (Trang 49 - 51)