Lượt Dữ liệu vào (lst1) Dữ liệu vào (lst2) Kết quả
1 (Join,1) (Join,1) (Join,2)
2 (Join,1) (Max,1) ; (Join,1) (Max,1) ; (Join, 2) 3 (Max,2) ; (Join, 2) (Join,1) (Max,2) ; (Join, 3)
3.2.2.4. Đồng bộ hóa các luồng song song khi kết thúc giao tác (Joint commit)
a. Mô tả thuật toán:
Đầu vào: Cho 2 chuỗi chính tắc không có phần tử chứa dấu “−”. Hàm joint commit
được viết để kết hợp 2 chuỗi chính tắc trên thành chuỗi mới theo quy tắc sau: jc(#n , #l) = #max(n,l)
jc(S'1+n#n , #l¬lS'2) = jc(S'1+(n−1)max((n' +1), (l'+l)),S'2) Đầu ra: Chuỗi chính tắc mới từ kết hợp 2 chuỗi chính tắc trên. Bước 1: Lấy lần lượt các phần tử trong chuỗi lst1, lst2 và kiểm tra:
- Nếu phần tử đầu của lst1 có dạng “+n1#n2” thì kiểm tra tiếp các phần tử trong lst2:
o Nếu phần tử đầu lst2 có dạng ¬l thì:
Loại bỏ phần tử đầu của chuỗi lst2.
Gọi hàm chính tắcseqvới đầu vào là chuỗi lst2 sau khi thêm vào phần tử #l
(Với l là giá trị của phần tử đầu mảng lst2 được loại bỏ ở trên).
Gọi đệ quy joint commit với chuỗi lst1 = +(n − 1) và lst2 sau khi đã thực
hiện các bước trên.
o Nếu các phần tử đầu lst2 có dạng #l1¬l2 thì:
Loại bỏ 2 phần tử đầu của lst2.
Gọi đệ quy joint commit với chuỗi lst1 = +(n−1) #(max (n2+1) (l1+l2) và lst2 sau khi đã thực hiện các bước trên.
- Nếu phần tử đầu của lst1 có dạng “+n1” thì kiểm tra tiếp các phần tử trong lst2:
o Nếu phần tử đầu lst2 có dạng ¬l thì:
Loại bỏ phần tử đầu của chuỗi lst2.
Gọi hàm chính tắc seq lại chuỗi lst2 sau khi thêm vào phần tử #l (Với l là
giá trị của phần tử đầu mảng lst2 được loại bỏ ở trên).
Gọi đệ quy joint commit với chuỗi lst1 = +(n − 1) và lst2 sau khi đã thực
hiện các bước trên.
o Nếu các phần tử đầu lst2 có dạng #l1¬l2 thì:
Loại bỏ 2 phần tử đầu của lst2.
Gọi hàm chính tắc seq với đầu vào là chuỗi lst2 ở trên.
Gọi đệ quy joint commit với chuỗi lst1 = +(n−1)và lst2 sau khi đã thực hiện
các bước trên.
b. Cài đặt và kiểm chứng:
Phương thức joint commit được đưa ra để có thể gộp 2 chuỗi có dấu chính tắc không bao gồm dấu“−” như sau:
1 letrec jc (lst1: TagSeq) (lst2: TagSeq) : TagSeq = 2 match lst1 with
3 | [] ->if List.isEmpty lst2 then
4 [] 5 else lst2 6 | (Tag.Plus,m1)::[] -> 7 match lst2 with 8 | [] -> lst1 9 | (Tag.Max,l1)::(Tag.Join,l2)::xs2 -> 10 if m1 > 1 then 11 jc [(Tag.Plus,m1-1)] (seq((Tag.Max,l1+l2)::xs2)) 12 else 13 (Tag.Max,l1+l2)::xs2 14 |(Tag.Join, l2)::xs2 -> 15 if m1 > 1 then
16 jc [(Tag.Plus, m1-1)] (seq ((Tag.Max, l2)::xs2)) 17 else
18 (Tag.Max, l2)::xs2
19 | otherwise -> failwith "Need attention in jc 1"
20 | (Tag.Plus,n1)::(Tag.Max,n2)::[] -> 21 match lst2 with 22 | [] -> lst1 23 | (Tag.Max,l1)::(Tag.Join,l2)::xs2 -> 24 if n1 >= 1 then 25 jc ((Tag.Plus,(n1-1))::[Tag.Max,(max (n2+1) (l1+l2))]) xs2 26 else 27 jc [Tag.Join,max (n2+1) (l1+l2)] xs2 28 | (Tag.Join, l2)::xs2-> 29 if n1 > 1 then
30 jc [(Tag.Plus, n1-1)] (seq ((Tag.Max, l2)::xs2)) 31 else
32 (Tag.Max, max (n2+1) l2)::xs2
33 | otherwise -> failwith "Need attention in jc 2"
Theo đó lần lượt đưa ra các dữ liệu đầu vào, ta có một số ví dụ minh họa cho việc kiểm chứng và có kết quả trả về đúng đắn.