Thực hành Hệ điều hành - Bài thực hành số 5.2: Viết phần mềm giải quyết deadlock
Giúp SV củng cố kiến thức về deadlock và hiện trạng giải quyết deadlock trên
Windows.
Giúp SV làm quen với việc dùng class Mutex của namespace System.Threadings, sự
hiện thực semaphore nhị phân của môi trường .NET, ₫ể loại trừ tương hỗ giữa các
thread khi chúng cù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() của class Mutex ₫ể giải quyết deadlock
(dùng chiến lược giết 1 hay nhiều thread tham gia deadlock)
Windows.
Giúp SV làm quen với việc dùng class Mutex của namespace System.Threadings, sự
hiện thực semaphore nhị phân của môi trường .NET, ₫ể loại trừ tương hỗ giữa các
thread khi chúng cù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() của class Mutex ₫ể giải quyết deadlock
(dùng chiến lược giết 1 hay nhiều thread tham gia deadlock)
Bạn đang xem tài liệu "Thực hành Hệ điều hành - Bài thực hành số 5.2: Viết phần mềm giải quyết deadlock", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- thuc_hanh_he_dieu_hanh_bai_thuc_hanh_so_5_2_viet_phan_mem_gi.pdf
Nội dung text: Thực hành Hệ điều hành - Bài thực hành số 5.2: Viết phần mềm giải quyết deadlock
- Trang 2 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 >= 0 && p.ty >= 0) { //hiện mũi tên góc dưới 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 >= 0 && p.ty = 0) { //hiện mũi tên góc dưới 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ên 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 hiện công việc của thread tốn 500ms MySleep(500); //xác ₫ịnh vị trí mới của 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 các 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 khi ngừng x1 = p.Pos.X; y1 = p.Pos.Y; g.FillRectangle(brush, xCell * x1, yCell * y1, xCell, yCell); //trả cell (x1,y1) cho các thread khác truy xuất mutList[y1, x1].ReleaseMutex(); // dừng Thread p.stop = true;