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

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 43 - 47)

Tính đúng đắn cục bộ chỉ thay đổi ở chỗ các tham biến hình thức threadcaller

được gán các giá trị ban đầu và null,0,null, trong đó là đối tượng ban đầu.

Định nghĩa 3.3.1. (Tính đúng đắn ban đầu) Cho thân của phương thức run của lớp chính c là  p y e  p stm return call call ; : 3 ? 2 2 ?

2  với biến cục bộ v không có các tham biến hình thức, c

LVar

z , và Object

LVar

z' . Một phác thảo chứng minh là đúng đắn ban đầu, nếu

G

| InitState z z'.z'nullzz'

v,thread,caller:Init v,z,null,0,null

P2 z , và

G

| InitState z z'.z'nullzz'

v,thread,caller:Init v,z,null,0,null; z.y2 :E2 z

GIP3 zIc z.

Khẳng định InitState zz'.z'nullzz' phát biểu rằng trạng thái toàn cục ban đầu định nghĩa một đối tượng z đang tồn tại trong trạng thái thể hiện ban đầu của nó, và quan sát y2 :e2 ở phần bắt đầu của phương thức run của đối tượng ban đầu z được thể hiện bởi phép gán z.y2: E2 z . Sự khác nhau là ở trong sự khởi tạo của cấu hình cục bộ, cấu hình cục bộ bây giờ được biểu diễn bởi phép gán

 , , ,0,0

: ,

, thread caller Initv thread null

v  .

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

Sự can thiệp của một luồng duy nhất dưới sự thi hành của nó giống như trong ngôn ngữ tuần tự. Tuy nhiên, ta phải giải quyết với sự bất biến của các thuộc tính của một luồng dưới sự thi hành của một luồng khác.

Một khẳng định q tại một điểm điều khiển phải là bất biến dưới một phép gán

e

y: trong cùng một lớp nếu cấu hình cục bộ được mô tả bởi khẳng định không hoạt động trong bước tính toán đang thi hành phép gán. Để phân biệt các biến cục bộ của các cấu hình cục bộ khác nhau, ta đặt lại tên của các biến cục bộ trong khẳng định mà phải là bất biến, có kết quả là các biến, các biểu thức, và các khẳng định được đánh

dấu phẩy. Ví dụ, trong các điều kiện ta sử dụng thread để nhận dạng luồng đang thi hành phép gán, và thread’ để nhận dạng luồng được mô tả bởi q.

Nếu qy:e thuộc về cùng một luồng, có nghĩa là , thead’ = thread, thì ta có cùng mệnh đề như đối với ngôn ngữ tuần tự. Nếu khẳng định và phép gán thuộc về các luồng khác nhau, tính không có can thiệp phải được biểu diễn trong tất cả các trường hợp trừ sự thi hành chính nó của phương thức start: Quan sát được gọi của một sự thi hành chính nó của phương thức start không thể can thiệp với điều kiện trước của sự thi hành. Để mô tả sự thiết lập này, ta định nghĩa self _startq,y:e bằng

this,conf',thread'

caller khi và chỉ khi q là điều kiện trước của sự thi hành phương

thức e0.start e và phép gán là quan sát được gọi tại phần bắt đầu của phương thức run, và bằng false nếu ngược lại.

Định nghĩa 3.3.2. (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 2.4.1 đúng với waits_ for_retq,y:e được thay thế bằng

q,y:e def

interferes thread = thread’waits_ for_retq,y:e

threadthread'self _startq,y:e

Ví dụ 3.3.3. Giả thiết một lệnh gán được chú thích  p stm trong một phương thức, và một khẳng định q tại một điểm điều khiển không đợi sự trả về trong cùng một phương thức, sao cho pq kéo theo thread = this. Điều này có nghĩa là, phương thức được thì hành chỉ bởi luồng của đối tượng mà phương thức đó thuộc về. Rõ ràng, pq

không thể đồng thời đạt tới được bằng cùng một luồng. Đối với tính bất biến của q

dưới phép gán stm, mệnh đề của điều kiện không có can thiệp kéo theo

q stm

q

p 'interferes , . Từ pq' ta kết luận thread = thread’, và do đó bằng định nghĩa của interferesq,y:e khẳng định q là một điểm điều khiển chờ trả về, nhưng trong trường hợp này thì không đúng, và do đó mệnh đề của điều kiện ước lượng là sai.

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

Kiểm tra sự hợp tác đối với tạo đối tượng không bị ảnh hưởng bởi việc thêm vào tính tương tranh. Sự thi hành của các phương thức khác với phương thức start, được thi hành bởi một luồng duy nhất, không bị ảnh hưởng bởi sự có mặt của tính tương tranh.

cạnh điều kiện trước của lời gọi, các bất biến toàn cục, bất biến lớp, ta giả sử rằng sự thi hành được cho phép, có nghĩa là, luồng của đối tượng được gọi chưa được bắt đầu, được định nghĩa bằng z'.started.

Định nghĩa 3.3.5. (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 sự giao tiếp, nếu các điều kiện của định nghĩa 2.4.14

đúng đối với các lệnh được liệt kê ở đó với mstart, và thêm vào các trường hợp sau: 1. CALLstart: Đối với tất cả các lệnh     ! 1 1 !  3

2 0 1 e .starte p y : e p p call call  trong lớp

c với e0 của kiểu c’, comm được cho bằng E0 zz'z'.started, trong đó

 q y e  q stm return call call ; : 3 ? 2 2 ?

2  là thân của của phương thức run của c’ có các tham biến hình thức u, và các biến cục bộ v trừ các tham biến hình thức. Bất biến của lớp được gọi là q1 Ic'. Hơn nữa, fcommu,'v': E z,Init v , fobs1 là

 z E y

z. 1: 1 , và fobs2 là z'.y2':E2' z' .

2. CALLstartskip: Đối với các lệnh phía trên, các phương trình phải đúng với khẳng định comm được cho bằng E0 zz'z'.started, q2 q3 true, q1 và fobs1 như phần trên, và fcommfobs2 là lệnh rỗng.

CHƯƠNG 4. BỘ ĐIỀU PHỐI LẶP LẠI

4.1. Cú pháp

Các phương thức được bao bọc bởi một từ bổ nghĩa modif phân biệt giữa các phương thức đồng bộ và không đồng bộ. Trong phần tiếp theo ta tham chiếu tới các lệnh trong thân của một phương thức đã đồng bộ như là đang được đồng bộ. Do vậy, ta xem các phương thức thêm vào được định nghĩa trước là wait, notify, và notifyAll

modif ::= nsyn | sync

meth ::= modif m (u, …, u) { stm; return expret}

run

meth ::= nsync run () { stm; return}

wait

meth ::= nsync wait () { ?signal; returngetlock}

notify

meth ::= nsync notify () {!signal; return }

notifyAll

meth ::= nsync notifyAll () { !signal_all; return }

predef

meth ::= methstart methwait methnotify methnotifyAll class ::= class c { meth … meth methrun methpredef }

main

class ::= class

prog ::= class … class classmain

Các định nghĩa của cú pháp sử dụng các câu lệnh bổ trợ !sinal, !signal_all, ?signal, và return getlock mô tả ở mức cao của kỹ thuật trừu tượng hóa signal-and-

continue dưới các phương thức wait, notify, và notifyAll.

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 43 - 47)

Tải bản đầy đủ (PDF)

(64 trang)