Kiểm chứng các điều kiện 51

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 51 - 54)

Tính đúng đắn cục bộ và tính đúng đắn ban đầu thì như là đối với Javaconc. Đối với tính đúng đắn cục bộ, chú ý rằng các điều kiện bao hàm thêm vào tính bất biến đối với các luồng đang thi hành thông báo. Tuy nhiên, ta không cần thêm vào các điều kiện cho trường hợp này, bởi vì kết quả của thông báo được giữ lại bởi một phép gán phụ trợ. Đố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 một khẳng định.

Kiểm tra tính không có can thiệp

Các phương thức được đồng bộ của một đối tượng duy nhất chỉ có thể được thi hành tương tranh nếu một trong các cấu hình cục bộ tương ứng đang chờ sự trả về: Nếu các luồng đang thi hành là khác nhau, thì một trong các luồng thi hành trong phương thức không được đồng bộ hóa wait của đối tượng; mặt khác, cả hai cấu hình cục bộ đang thi hành là trong cùng một dãy lời gọi.

Định nghĩa 4.3.1. (Tính không có can thiệp) Một phác thảo chứng minh là không có

can thiệp, nếu các điều kiện của định nghĩa 3.3.2 đúng đối với tất cả các lớp c, tất cả các phép gán bội y:e với điều kiện p trong c, và tất cả các khẳng định q tại các điểm điều khiển trong c, sao cho hoặc là cả hai pq không xuất hiện trong một phương thức đồng bộ, hoặc là q là một điểm điều khiển đang chờ sự trả về.

Chú ý rằng đối với thông báo, ta cũng yêu cầu tính bất biến của các khẳng định của các luồng đang đợi thông báo. Thông báo được mô tả bằng một phép gán phụ trợ được thi hành bởi luồng thông báo. Điều đó có nghĩa là, cả hai tình trạng đang đợi và tình trạng được thông báo của một luồng bị tạm thời ngừng được thay thế bằng một điểm điều khiển duy nhất trong phương thức wait. Hai tình trạng có thể được phân biệt

bằng các giá trị của các biến wait và biến notified. Tính bất biến của điều kiện trước của lệnh trả về trong phương thức wait dưới phép gán trong phương thức notify biểu thị quá trình thông báo, trong khi đó tính bất biến của khẳng định thông qua các phép gán thay đổi khóa biểu thị kỹ thuật đồng bộ hóa. Thông tin về giá trị khóa được khai báo từ kiểm tra sự hợp tác bởi vì thông tin này phụ thuộc vào hành vi toàn cục.

Ví dụ 4.3.2. Ví dụ này biểu diễn cách nhiều nhất một luồng có thể sở hữu khóa của

một đối tượng có thể được sử dụng để biểu diễn sự loại trừ lẫn nhau. Ta sử dụng khẳng định ownsthread,lock đối với threadnullthreadlockthread, trong đó

lock

thread là thành phần đầu tiên của giá trị khóa. Cho free_ forthread,lock là

 

owns thread lock lock free

null

thread   ,   .

Cho q, được cho bởi ownsthread,lock, là một khẳng định tại một điểm điều khiển và cho  call call

stm

p ? ? với pdef free_ forthread,lock là quan sát được gọi tại phần bắt đầu của một phương thức được đồng bộ hóa trong cùng lớp. Chú ý rằng quan sát stm thay đổi giá trị khóa. Điều kiện không có can thiệp

 

 ' interferes ,   '

|L pqq stm stm q đảm bảo tính bất biến của q dưới quan sát stm. Các khẳng định pq’ kéo theo thread = thread’. Các điểm tại pq chỉ có thể đạt tới được đồng thời bởi cùng một luồng nếu q mô tả một điểm đang chờ trả về. Nhưng điều đó là sai bởi định nghĩa của vị từ interferes: Nếu q không ở một điểm điều khiển đang chờ trả về, thì mệnh đề của điều kiện ước lượng là sai. Mặt khác, sau sự thi hành của lệnh phụ trợ tích hợp lock:inclock trong stm ta có ownsthread,lock, có nghĩa là ownsthread',lock.

Kiểm tra sự hợp tác

Ta mở rộng kiểm tra sự hợp tác cho Javaconc với kỹ thuật đồng bộ hóa và với sự thi hành của các phương thức điều phối. Trong các ngôn ngữ trước, khẳng định comm

phát biểu rằng các lệnh được cho đại diện các đối tác giao tiếp. Trong ngôn ngữ hiện tại với sự đồng bộ hóa điều phối, giao tiếp luôn luôn được cho phép. Do vậy khẳng định comm phải giữ thêm tính được cho phép của giao tiếp: Trong trường hợp thi hành một phương thức được đồng bộ hóa, khóa của đối tượng phải là tự do hoặc thuộc sở hữu của luồng gọi. Điều này được biểu diễn bởi z'.lockfreethreadz'.lockthread, trong đó thread là luồng gọi, z’ là đối tượng được gọi, và trong đó threadz'.lock là thành phần đầu tiên của giá trị khóa, có nghĩa là, luồng đang sở hữu khóa của z’. Đối với sự thi hành của các phương thức điều phối ta yêu cầu rằng luồng đang thi hành

đang giữ khóa. Sự trả về từ phương thức wait giả thiết rằng luồng được thông báo và khóa của đối tượng được gọi là tự do.

Định nghĩa 4.3.3. (Kiểm tra sự hợp tác: Giao tiếp) Một phác thảo chứng minh thỏa

mãn kiểm tra sự hợp tác đối với giao tiếp, nếu các điều kiện của định nghĩa 3.3.5 đúng đối với các lệnh được liệt kê ở đó với ngoại lệ của trường hợp quy tắc CALL, và thêm vào các trường hợp sau đây:

1.CALL: Sự thi hành của các phương thức không được đồng bộ hóa m với

start wait notify notifyAll

m , , , được xử lý như trước đó. Đối với tất cả các lệnh

    call call wait (adsbygoogle = window.adsbygoogle || []).push({});

ret e me p y e p u p 3 ! 1 1 ! 2 0

1 : . : (hoặc là các lệnh này mà không nhận một giá trị) trong lớp c với e0 của kiểu c’, trong đó phương thức

start wait notify notifyAll

m , , , của c’ được đồng bộ hóa với thân

 call call  ret

e return stm q e y q : 3 ; ? 2 2 ? 2  , các biến hình thức u, và các biến cục bộ

v ngoại trừ các biến hình thức, các điều kiện 2.62.7 phải đúng với các định nghía sau: Bất biến của lớp được gọi là q1:Ic'. Khẳng định comm được cho bằng E0 zz'z'.lockfreethreadz'.lockthread. Hơn nữa, fcomm

 z Init v E

v

u', ': , , fobs1 được cho bằng z.y1:E1 z , và fobs2 là z'.y2':E2' z' . 2.CALLmonitor: Đối với mwait,notify,notifyAll, comm được cho bằng

 z z threadz lockthread

E0  ' '.  .

3.RETURNwait: Đối với    ! 3 3 !  3

2

1 return q y : e q

q

ret ret

getlock  trong phương thức

wait, commE0 zz'u'E zz'.lockfreethread'z'.notified.

Ví dụ 4.3.4. Giả thiết rằng sự thi hành của một phương thức được đồng bộ m của một lớp c, trong đó m của c có thân stm ?callthreadlockthreadstm'; return. Chú ý rằng sự mở rộng được tích hợp trong stm thiết lập luồng sở hữu khóa bằng phép gán

lock

inc

lock: . Kiểm tra sự hợp tác yêu cầu rằng

  '. :  '.   '.  '

CHƯƠNG 5. PHÉP TOÁN ĐIỀU KIỆN TRƯỚC YẾU NHẤT

Để tăng tính dễ đọc, kiểm chứng các điều kiện của các chương trước được đưa ra như là các bộ ba logic Hoare chuẩn. Mục đích của chúng ta là sử dụng một bộ chứng minh định lý để chứng minh các điều kiện này. Thay vì thi hành các ngữ nghĩa của các bộ ba logic Hoare trong bộ chứng minh định lý, ta đưa ra ngữ nghĩa trong các phép kéo theo logic thông qua một phép toán điều kiện trước yếu nhất. Theo cách này ta chỉ phải thi hành các ngữ nghĩa của các khẳng định trong bộ chứng minh định lý.

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 51 - 54)