1. Trang chủ
  2. » Giáo án - Bài giảng

hệ điều hành nguyễn văn hiệp bài 5 2 viet phần mềm giải quyết deadlocksinhvienzone com

3 131 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 3
Dung lượng 92,99 KB

Nội dung

Trang MÔN : HỆ ĐIỀU HÀNH Bài thực hành số 5.2 : Viết phần mềm giải deadlock I Mục tiêu : ƒ Giúp SV củng cố kiến thức deadlock trạng giải deadlock Windows ƒ Giúp SV làm quen với việc dùng class Mutex namespace System.Threadings, thực semaphore nhị phân môi trường NET, ₫ể loại trừ tương hỗ thread chúng truy xuất vào tài nguyên dùng chung ƒ Giúp SV biết cách dùng tác vụ WaitOne() class Mutex ₫ể giải deadlock (dùng chiến lược giết hay nhiều thread tham gia deadlock) II Nội dung : ƒ Tìm cách giải deadlock thread chùng chờ lẫn việc hiển thị icon lên cell dùng chung ƒ Dùng tác vụ WaitOne(thời gian chờ hữu hạn) class Mutex ₫ể giải deadlock III Chuẩn ₫ầu : ƒ Sinh viên nắm vững sử dụng thành thạo class Thread ₫ể quản lý thread ƒ Sinh viên nắm vững vấn ₫ề deadlock thread chúng chờ lẫn ƒ Sinh viên nắm vững sử dụng thành thạo class Mutex ₫ể loại trừ tương hỗ thread chúng truy xuất vào tài nguyên dùng chung, ₫ể giải deadlock cách giết hay nhiều thread tham gia deadlock IV Qui trình : Chạy VS Net, mở lại Project 5.1 vừa thực hiệu chỉnh lại hàm Running class Form1 sau : //₫ịnh nghĩa hàm mà thread chạy void Running(object obj) { //ép kiểu tham số MyThread theo yêu cầu xử lý MyThread p = (MyThread)obj; //tạo ₫ối tượng vẽ Graphics g = this.CreateGraphics(); //tạo chổi màu ₫en ₫ể xóa cell cũ Brush brush = new SolidBrush(Color.FromArgb(0, 0, 0)); //xin khóa truy xuất cell (x1,y1) mutList[p.Pos.Y, p.Pos.X].WaitOne(); int x1, y1; int x2, y2; int x, y; bool kq=true; try { while (p.start) { //lặp chưa có yêu cầu kết thúc //xác ₫ịnh tọa ₫ộ hành thread x1 = p.Pos.X; y1 = p.Pos.Y; //hiển thị logo thread (x1,y1) g.DrawImage(p.Pic, xCell * x1, yCell * y1); Color c = p.Pic.GetPixel(1,1); SinhVienZone.com https://fb.com/sinhvienzonevn Trang int yR, yG, yB; if (c.R > 128) yR = 0; else yR = 255; if (c.G > 128) yG = 0; else yG = 255; if (c.B > 128) yB = 0; else yB = 255; Pen pen = new Pen(Color.FromArgb(yR, yG, yB), 2); if (p.tx >= && p.ty >= 0) { //hiện mũi tên góc phải x = xCell * x1 + xCell - 2; y = yCell * y1 + yCell - 2; g.DrawLine(pen, x, y, x - 10, y); g.DrawLine(pen, x, y, x, y-10); } else if (p.tx >= && p.ty < 0) { //hiện mũi tên góc phải x = xCell * x1 + xCell - 2; y = yCell * y1 + 2; g.DrawLine(pen, x, y, x - 10, y); g.DrawLine(pen, x, y, x, y + 10); } else if (p.tx < && p.ty >= 0) { //hiện mũi tên góc trái x = xCell * x1 + 2; y = yCell * y1 + yCell - 2; g.DrawLine(pen, x, y, x + 10, y); g.DrawLine(pen, x, y, x, y - 10); } else {//hiện mũi tên góc trái x = xCell * x1 + 2; y = yCell * y1 + 2; g.DrawLine(pen, x, y, x + 10, y); g.DrawLine(pen, x, y, x, y + 10); } //giả lập thực công việc thread tốn 500ms MySleep(500); //xác ₫ịnh vị trí thread p.HieuchinhVitri(); x2 = p.Pos.X; y2 = p.Pos.Y; //xin khóa truy xuất cell (x2,y2) while (true) { kq = mutList[y2, x2].WaitOne(new TimeSpan(0,0,2)); if (kq==true || p.start==false) break; } // Xóa vị trí cũ g.FillRectangle(brush, xCell * x1, yCell * y1, xCell, yCell); //trả cell (x1,y1) cho thread khác truy xuất mutList[y1, x1].ReleaseMutex(); } } catch (Exception e) { p.stop = true; p.t.Abort(); } //dọn dẹp thread trước ngừng x1 = p.Pos.X; y1 = p.Pos.Y; g.FillRectangle(brush, xCell * x1, yCell * y1, xCell, yCell); //trả cell (x1,y1) cho thread khác truy xuất mutList[y1, x1].ReleaseMutex(); // dừng Thread p.stop = true; SinhVienZone.com https://fb.com/sinhvienzonevn Trang p.t.Abort(); }  Chọn menu Debug.Start Debugging ₫ể dịch chạy thử ứng dụng Khi Form chương trình hiển thị, thực gỏ phím qui ₫ịnh sau ₫ể quản lý thread : ƒ Ấn phím từ A-Z ₫ể kích hoạt chạy thread có tên tương ứng ƒ Ấn phím Ctrl-Alt-X ₫ể tạm dừng chạy thread X ƒ Ấn phím Alt-X ₫ể chạy tiếp thread X ƒ Ấn phím Shift-X ₫ể tăng ₫ộ ưu tiên chạy cho thread X ƒ Ấn phím Ctrl-X ₫ể giảm ₫ộ ưu tiên chạy cho thread X ƒ Ấn phím Ctrl-Shift-X ₫ể dừng thread X Khi số thread chạy tương ₫ối nhiều, quan sát tượng deadlock, nghĩa thread dừng chờ lẫn khơng có thread chạy tiếp ₫ược Để giải deadlock nhóm thread dừng chờ lẫn nhau, ta xác ₫ịnh thread nhóm xóa (bằng cách dùng tổ hợp phím Ctrl-Shift-X), tiếp tục giải deadlock cho ₫ến khơng deadlock (có thể nhiều thread bị giết) Thread bị giết mà muốn chạy lại, ta dùng phím từ A-Z ₫ể kích hoạt lại SinhVienZone.com https://fb.com/sinhvienzonevn ... yR, yG, yB; if (c.R > 128 ) yR = 0; else yR = 25 5 ; if (c.G > 128 ) yG = 0; else yG = 25 5 ; if (c.B > 128 ) yB = 0; else yB = 25 5 ; Pen pen = new Pen(Color.FromArgb(yR, yG, yB), 2) ; if (p.tx >= && p.ty... vị trí thread p.HieuchinhVitri(); x2 = p.Pos.X; y2 = p.Pos.Y; //xin khóa truy xuất cell (x2,y2) while (true) { kq = mutList[y2, x2].WaitOne(new TimeSpan(0,0 ,2) ); if (kq==true || p.start==false)... góc trái x = xCell * x1 + 2; y = yCell * y1 + 2; g.DrawLine(pen, x, y, x + 10, y); g.DrawLine(pen, x, y, x, y + 10); } //giả lập thực công việc thread tốn 50 0ms MySleep (50 0); //xác ₫ịnh vị trí

Ngày đăng: 28/01/2020, 22:29

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN