ĐỒ ÁN TỐT NGHIỆP TÌM HIỂU NGÔN NGỮ C# VÀ VIẾT MỘT ỨNG DỤNG MINH HỌA PHẦN 9
Số trang: 28
Loại file: pdf
Dung lượng: 387.44 KB
Lượt xem: 12
Lượt tải: 0
Xem trước 3 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Tham khảo tài liệu 'đồ án tốt nghiệp tìm hiểu ngôn ngữ c# và viết một ứng dụng minh họa phần 9', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Nội dung trích xuất từ tài liệu:
ĐỒ ÁN TỐT NGHIỆP TÌM HIỂU NGÔN NGỮ C# VÀ VIẾT MỘT ỨNG DỤNG MINH HỌA PHẦN 9 Thread và Sự Đồng Bộ Gvhd: Nguyễn Tấn Trần Minh Khang void Decrementer( ) { try { // synchronize this area of code Monitor.Enter(this); // if counter is not yet 10 // then free the monitor to other waiting // threads, but wait in line for your turn if (counter < 10) { Console.WriteLine( [{0}] In Decrementer. Counter: {1}. Gotta Wait!, Thread.CurrentThread.Name, counter); Monitor.Wait(this); } while (counter >0) { long temp = counter; temp--; Thread.Sleep(1); counter = temp; Console.WriteLine([{0}] In Decrementer. Counter: {1}., Thread.CurrentThread.Name, counter); } } finally { Monitor.Exit(this); } } void Incrementer( ) { try { Monitor.Enter(this); while (counter < 10) { long temp = counter; temp++; Thread.Sleep(1); counter = temp; Console.WriteLine([{0}] In Incrementer. Counter: {1}, Thread.CurrentThread.Name, counter); } // I'm done incrementing for now, let another // thread have the Monitor Monitor.Pulse(this); } finally { Console.WriteLine([{0}] Exiting..., Thread.CurrentThread.Name); Monitor.Exit(this); } } private long counter = 0; } 220 Thread và Sự Đồng Bộ Gvhd: Nguyễn Tấn Trần Minh Khang } Kết quả: Started thread Thread1 [Thread1] In Decrementer. Counter: 0. Gotta Wait! Started thread Thread2 [Thread2] In Incrementer. Counter: 1 [Thread2] In Incrementer. Counter: 2 [Thread2] In Incrementer. Counter: 3 [Thread2] In Incrementer. Counter: 4 [Thread2] In Incrementer. Counter: 5 [Thread2] In Incrementer. Counter: 6 [Thread2] In Incrementer. Counter: 7 [Thread2] In Incrementer. Counter: 8 [Thread2] In Incrementer. Counter: 9 [Thread2] In Incrementer. Counter: 10 [Thread2] Exiting... [Thread1] In Decrementer. Counter: 9. [Thread1] In Decrementer. Counter: 8. [Thread1] In Decrementer. Counter: 7. [Thread1] In Decrementer. Counter: 6. [Thread1] In Decrementer. Counter: 5. [Thread1] In Decrementer. Counter: 4. [Thread1] In Decrementer. Counter: 3. [Thread1] In Decrementer. Counter: 2. [Thread1] In Decrementer. Counter: 1. [Thread1] In Decrementer. Counter: 0. All my threads are done. 20.3 Race condition và DeadLock Đồng bộ hóa thread khá rắc rối trong những chương trình phức tạp. Bạn cần phải cẩn thận kiểm tra và giải quyết các vấn đề liên quan đến đồng bộ hóa thread: race condition và deadlock 20.3.1 Race condition Một điều kiện tranh đua xảy ra khi sự đúng đắn của ứng dụng phụ thuộc vào thứ tự hoàn thành không kiểm soát được của 2 thread độc lập với nhau. Ví dụ: giả sử bạn có 2 thread. Thread 1 tiến hành mở tập tin, thread 2 tiến hành ghi lên cùng tập tin đó. Điều quan trọng là bạn cần phải điều khiển thread 2 sao cho nó chỉ tiến hành công việc sau khi thread 1 đã tiến hành xong. Nếu không, thread 1 sẽ không mở được tập tin vì tập tin đó đã bị thread 2 mở để ghi. Kết quả là chương trình sẽ ném ra exception hoặc tệ hơn nữa là crash. Để giải quyết vấn đề trong ví dụ trên, bạn có thể tiến hành join thread 2 với thread 1 hoặc thiết lập monitor. 20.3.2 Deadlock Giả sử thread A đã nắm monitor của tài nguyên X và đang chờ monitor của tài nguyên Y. Trong khi đó thì thread B lại nắm monitor của tài nguyên Y và chờ 221 Thread và Sự Đồng Bộ Gvhd: Nguyễn Tấn Trần Minh Khang monitor của tài nguyên X. 2 thread cứ chờ đợi lẫn nhau mà không thread nào có thể thoát ra khỏi tình trạng chờ đợi. Tình trạng trên gọi là deadlock. Trong một chương trình nhiều thread, deadlock rất khó phát hiện và gỡ lỗi. Một hướng dẫn để tránh deadlock đó là giải phóng tất cả lock đang sở hữu nếu tất cả các lock cần nhận không thể nhận hết được. Một hướng dẫn khác đó là giữ lock càng ít càng tốt. 222 Luồng dữ liệu. Gvhd: Nguyễn Tấn Trần Minh Khang Chương 21 Luồng dữ liệu. Khi muốn đọc hay ghi dữ liệu vào/ra tập tin hay muốn truyền dữ liệu từ máy này sang máy khác, ta phải tổ chức dữ liệu theo cấu trúc tuần tự các byte hay các gói tin …. Điều này dễ liên tưởng dữ liệu như là các luồng dữ liệu chảy từ từ nguồn đến đích. Thư viện .NET Framework cung cấp các lớp Stream (Stream và các lớp thừa kế từ nó) để chương trình có thể sử dụng trong các thao tác nhập xuất dữ liệu như doc/ghi tập tin, truyền dữ liệu qua mạng … 21.1 Tập tin và thư mục Các lớp đề cập trong chương này thuộc về vùng tên System.IO. Các lớp này bao gồm lớp File mô phỏng cho một tập tin trên đĩa, và lớp Directory mô phỏng cho một thư mục trên đĩa. 21.1.1 Làm việc với thư mục Lớp Directory có nhiều phương thức dành cho việc tạo, di chuyển, duyệt thư mục. Các phương thức trong lớp Directory đều là phương thức tĩnh;vì vậy không cần phải tạo một thể hiện lớp Directory mà có thể truy xuất trực tiếp từ tên lớp. Lớp DirectoryInfo là lớp tương tự như lớp Directory. Nó cung các tất cả các phương thức mà lớp Directory có đồng thời bổ sung nhiều ...
Nội dung trích xuất từ tài liệu:
ĐỒ ÁN TỐT NGHIỆP TÌM HIỂU NGÔN NGỮ C# VÀ VIẾT MỘT ỨNG DỤNG MINH HỌA PHẦN 9 Thread và Sự Đồng Bộ Gvhd: Nguyễn Tấn Trần Minh Khang void Decrementer( ) { try { // synchronize this area of code Monitor.Enter(this); // if counter is not yet 10 // then free the monitor to other waiting // threads, but wait in line for your turn if (counter < 10) { Console.WriteLine( [{0}] In Decrementer. Counter: {1}. Gotta Wait!, Thread.CurrentThread.Name, counter); Monitor.Wait(this); } while (counter >0) { long temp = counter; temp--; Thread.Sleep(1); counter = temp; Console.WriteLine([{0}] In Decrementer. Counter: {1}., Thread.CurrentThread.Name, counter); } } finally { Monitor.Exit(this); } } void Incrementer( ) { try { Monitor.Enter(this); while (counter < 10) { long temp = counter; temp++; Thread.Sleep(1); counter = temp; Console.WriteLine([{0}] In Incrementer. Counter: {1}, Thread.CurrentThread.Name, counter); } // I'm done incrementing for now, let another // thread have the Monitor Monitor.Pulse(this); } finally { Console.WriteLine([{0}] Exiting..., Thread.CurrentThread.Name); Monitor.Exit(this); } } private long counter = 0; } 220 Thread và Sự Đồng Bộ Gvhd: Nguyễn Tấn Trần Minh Khang } Kết quả: Started thread Thread1 [Thread1] In Decrementer. Counter: 0. Gotta Wait! Started thread Thread2 [Thread2] In Incrementer. Counter: 1 [Thread2] In Incrementer. Counter: 2 [Thread2] In Incrementer. Counter: 3 [Thread2] In Incrementer. Counter: 4 [Thread2] In Incrementer. Counter: 5 [Thread2] In Incrementer. Counter: 6 [Thread2] In Incrementer. Counter: 7 [Thread2] In Incrementer. Counter: 8 [Thread2] In Incrementer. Counter: 9 [Thread2] In Incrementer. Counter: 10 [Thread2] Exiting... [Thread1] In Decrementer. Counter: 9. [Thread1] In Decrementer. Counter: 8. [Thread1] In Decrementer. Counter: 7. [Thread1] In Decrementer. Counter: 6. [Thread1] In Decrementer. Counter: 5. [Thread1] In Decrementer. Counter: 4. [Thread1] In Decrementer. Counter: 3. [Thread1] In Decrementer. Counter: 2. [Thread1] In Decrementer. Counter: 1. [Thread1] In Decrementer. Counter: 0. All my threads are done. 20.3 Race condition và DeadLock Đồng bộ hóa thread khá rắc rối trong những chương trình phức tạp. Bạn cần phải cẩn thận kiểm tra và giải quyết các vấn đề liên quan đến đồng bộ hóa thread: race condition và deadlock 20.3.1 Race condition Một điều kiện tranh đua xảy ra khi sự đúng đắn của ứng dụng phụ thuộc vào thứ tự hoàn thành không kiểm soát được của 2 thread độc lập với nhau. Ví dụ: giả sử bạn có 2 thread. Thread 1 tiến hành mở tập tin, thread 2 tiến hành ghi lên cùng tập tin đó. Điều quan trọng là bạn cần phải điều khiển thread 2 sao cho nó chỉ tiến hành công việc sau khi thread 1 đã tiến hành xong. Nếu không, thread 1 sẽ không mở được tập tin vì tập tin đó đã bị thread 2 mở để ghi. Kết quả là chương trình sẽ ném ra exception hoặc tệ hơn nữa là crash. Để giải quyết vấn đề trong ví dụ trên, bạn có thể tiến hành join thread 2 với thread 1 hoặc thiết lập monitor. 20.3.2 Deadlock Giả sử thread A đã nắm monitor của tài nguyên X và đang chờ monitor của tài nguyên Y. Trong khi đó thì thread B lại nắm monitor của tài nguyên Y và chờ 221 Thread và Sự Đồng Bộ Gvhd: Nguyễn Tấn Trần Minh Khang monitor của tài nguyên X. 2 thread cứ chờ đợi lẫn nhau mà không thread nào có thể thoát ra khỏi tình trạng chờ đợi. Tình trạng trên gọi là deadlock. Trong một chương trình nhiều thread, deadlock rất khó phát hiện và gỡ lỗi. Một hướng dẫn để tránh deadlock đó là giải phóng tất cả lock đang sở hữu nếu tất cả các lock cần nhận không thể nhận hết được. Một hướng dẫn khác đó là giữ lock càng ít càng tốt. 222 Luồng dữ liệu. Gvhd: Nguyễn Tấn Trần Minh Khang Chương 21 Luồng dữ liệu. Khi muốn đọc hay ghi dữ liệu vào/ra tập tin hay muốn truyền dữ liệu từ máy này sang máy khác, ta phải tổ chức dữ liệu theo cấu trúc tuần tự các byte hay các gói tin …. Điều này dễ liên tưởng dữ liệu như là các luồng dữ liệu chảy từ từ nguồn đến đích. Thư viện .NET Framework cung cấp các lớp Stream (Stream và các lớp thừa kế từ nó) để chương trình có thể sử dụng trong các thao tác nhập xuất dữ liệu như doc/ghi tập tin, truyền dữ liệu qua mạng … 21.1 Tập tin và thư mục Các lớp đề cập trong chương này thuộc về vùng tên System.IO. Các lớp này bao gồm lớp File mô phỏng cho một tập tin trên đĩa, và lớp Directory mô phỏng cho một thư mục trên đĩa. 21.1.1 Làm việc với thư mục Lớp Directory có nhiều phương thức dành cho việc tạo, di chuyển, duyệt thư mục. Các phương thức trong lớp Directory đều là phương thức tĩnh;vì vậy không cần phải tạo một thể hiện lớp Directory mà có thể truy xuất trực tiếp từ tên lớp. Lớp DirectoryInfo là lớp tương tự như lớp Directory. Nó cung các tất cả các phương thức mà lớp Directory có đồng thời bổ sung nhiều ...
Tìm kiếm theo từ khóa liên quan:
ngôn ngữ C# tin học ứng dụng lập trình windows lập trình C# mẹo hay cho tin học thủ thuật windowsGợi ý tài liệu liên quan:
-
Tài liệu bồi dưỡng giáo viên sử dụng SGK Tin học 10 Cánh diều (Định hướng Tin học ứng dụng)
61 trang 238 0 0 -
101 trang 199 1 0
-
20 trang 183 0 0
-
Cách gỡ bỏ hoàn toàn các add on trên Firefox
7 trang 180 0 0 -
Bài tập lập trình Windows dùng C# - Bài thực hành
13 trang 177 0 0 -
Giáo trình Mạng máy tính (Nghề: Tin học ứng dụng - Trung cấp) - Trường Cao đẳng Cộng đồng Đồng Tháp
189 trang 164 0 0 -
bảo mật mạng các phương thức giả mạo địa chỉ IP fake IP
13 trang 157 0 0 -
Giáo trình Tin học ứng dụng: Phần 1 - Trường ĐH Tài nguyên và Môi trường Hà Nội
125 trang 151 0 0 -
Bài giảng Tin học ứng dụng: Kiểm định trung bình - Trường ĐH Y dược Huế
25 trang 144 0 0 -
161 trang 129 1 0