Lập trình đa tuyến MULTITHREADINGMục tiêu : Kết thúc bài học SV có thể: • Nêu được khái niệm Tuyến Thread và tiến trình Process • Phân tích được những ưu điểm của lập trình đa tuyến • Tr
Trang 1Lập trình đa tuyến (MULTITHREADING)
Biên tập bởi:
Khoa CNTT ĐHSP KT Hưng Yên
Trang 2Lập trình đa tuyến (MULTITHREADING)
Biên tập bởi:
Khoa CNTT ĐHSP KT Hưng Yên
Các tác giả:
Khoa CNTT ĐHSP KT Hưng Yên
Phiên bản trực tuyến:
http://voer.edu.vn/c/bc908932
Trang 3MỤC LỤC
1 Lập trình đa tuyến (MULTITHREADING)
Tham gia đóng góp
Trang 4Lập trình đa tuyến (MULTITHREADING)
Mục tiêu :
Kết thúc bài học SV có thể:
• Nêu được khái niệm Tuyến (Thread) và tiến trình (Process)
• Phân tích được những ưu điểm của lập trình đa tuyến
• Trình bày được các phương thức của lớp Threading
• Vận dụng cơ chế đa tuyến, viết một số ứng dụng đơn giản
Nội dung:
Một số khái niệm
Đa nhiệm
– Mutitasking : Là khả năng của hệ điều hành làm nhiều công việc (ví dụ chạy nhiều ứng dụng) tại một thời điểm
Tiến trình
– Process : Khi chạy một ứng dụng, hệ điều hành sẽ cấp phát riêng cho ứng dụng đó bộ nhớ và các tài nguyên khác Bộ nhớ và tài nguyên vật lý riêng biệt này được gọi là một tiến trình Các tài nguyên và bộ nhớ của một tiến trình thì chỉ tiến trình đó được phép truy cập
Lưu ý Một ứng dụng thường có một tiến trình nhưng cũng có thể có nhiều tiến trình ! Tiến trình ≠ Ứng dụng
Tuyến (đoạn) – Thread :
Trong hệ thống, một tiến trình có thể có một hoặc nhiều chuỗi thực hiện tách biệt nhau
và có thể chạy đồng thời Mỗi chuỗi thực hiện này được gọi là một tuyến (Thread) Trong một ứng dụng, Thread khởi tạo đầu tiên gọi là Thread sơ cấp hay Thread chính (Chính là phương thức Sub Main)
Trang 5Một hình ảnh khác về mô hình đơn tuyến và đa tuyến:
Có 2 mô hình thread là Apartment Threading và Free Threading
Trang 6Free - threading
Trong mô hình thứ hai, do các thread có thể cùng chia sẻ và truy cập dữ liệu chung, do vậy có thể xảy ra xung đột (khiến kết quả không như mong muốn)
Ví dụ:
Trang 7Kết quả không thể xác định được (không nhất quán) khi nhiều thread cùng truy cập
Ưu điểm và hạn chế của cơ chế đa tuyến
Ưu điểm:
Trong một ứng dụng có thể cho nhiều "công việc" (tuyến-thread) được thực thi đồng thời Các công việc này hoạt động độc lập với nhau và đóng vai trò như những chương trình riêng biệt Một thread có thể treo (Hang) mà không ảnh hưởng đến các thread khác
Đa tuyến đặc biệt hữu ích trong việc xây dựng các ứng dụng Server – cái mà đáp ứng nhiều yêu cầu từ các Client
Hạn chế:
Việc cài đặt chương trình theo kiểu đa tuyến phức tạp hơn Đồng thời phải giải quyết vấn đề xung đột tài nguyên dùng chung Việc cài đặt đa tuyến cũng sẽ tốn bộ nhớ hơn vì
hệ thống phải lưu lại những thông tin về mỗi thread Hơn nữa Processor phải mất nhiều thời gian hơn cho việc luân chuyển (switching) giữa các tuyến với nhau Một vấn đề khác nữa là tình huống khóa chết – deadlock !
Trang 8Khóa chết – Deadlock
Đa tuyến trong NET
MS.NET Framework cung cấp cho nhà phát triển cơ chế đa tuyến theo mô hình Free
Threading Việc tạo và quản lý tuyến được thực hiện thông qua lớp Thread, thuộc namespace là System.Threading.
Mô tả về lớp Thread:
Một số phương thức thường dùng
Một số thuộc tính public thường dùng:
Trang 9Tạo một Thread trong VB.NET
Cú pháp tạo một tuyến trong VB.NET
ở trên là một ví dụ về : Một tiến trình có một Thread
- Phân tích ví dụ trên:
- Một số câu hỏi:
Trang 10Cho biết trình tự hiển thị các thông báo khi chạy chương trình sau đây:
Ví dụ 2: Tạo nhiều thread trong một tiến trình
Trong một chương trình (tiến trình) có thể tạo nhiều Thread, ví dụ:
Câu hỏi: Cho biết thứ tự thông báo sau đây ?
Trang 11Một ví dụ khác:
Trang 12Phương thức Join()
Theo mặc định, khi gọi phương thức Start của một thread thì câu lệnh ngay sau nó sẽ được thực thi mà không phụ thuộc vào việc thread đó đã kết thúc hay chưa Như vậy, trong trường hợp nếu câu lệnh ngay sau lời gọi phương thức Start mà phụ thuộc vào kết quả thực thi của Thread (nói cách khác là ta muốn thread phải kết thúc trước khi làm câu lệnh sau Start) thì sẽ dẫn đến kết quả sai
Ví dụ: Hiển thị các số từ 1 đến 10 Sau khi hiển thị xong thì thông báo "Đã xong !"
→ Rõ ràng là thông báo "Đã xong" chỉ được thực hiện sau khi Thread kết thúc
Trang 13Lưu ý: Phương thức Join chỉ được gọi nếu Thread đang ở trạng thái Running (Trước đó
phải Start rồi) Có thể kiểm tra trạng thái của thread thông qua ThreadState.
Vấn đề xung đột trong cơ chế đa tuyến.
Trong ứng dụng windows Form, khi có nhiều Thread của ứng dụng truy cập ghi (write) đến điều khiển (Control) trên Form (tổng quát là truy cập đến Control toàn cục) thì NET
luôn cảnh báo với lỗi : "Cross-thread operation not valid…."
→ Giải quyết vấn đề này:
+ Nếu bạn thấy rằng việc truy cập đồng thời không gây ra những lỗi tiềm ẩn hay kết quả
có thể xác định được thì bạn cứ dịch ra file Exe và chạy bình thường Hoặc:
+ System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
+ Hoặc không Nhấn F5 (chế độ chạy có Debug) mà nhấn Ctrl-F5 (Không debug)
Ví dụ:
Tạo 2 thread, một thread TinhTong và một Thread TinhHieu của 2 số, kết quả hiển thị
trên 2 Label tương ứng
→ Rõ ràng hai thread này chỉ đọc giá trị trong textbox và ghi kết quả ra 2 label riêng biệt nên không có lỗi tiềm ẩn nào → ta không cần quan tâm đến cảnh báo của VS.NET
Ý nghĩa : Tại một thời điểm chỉ cho phép một thread chạy đoạn lệnh (*) mà thôi Điều
này giúp ta tránh được các kết quả không theo ý muốn
Trang 14Ví dụ 2:
Viết 2 Thread, mỗi thread đều hiển thị kết quả trên cùng một textbox
Trang 15
Kết quả khi có SyncLock
Một số ví dụ
Viết chương trình thể hiện 2 thanh tiến trình.
Trang 16Viết chương trình mô phỏng đồng hồ điện tử
Trang 18Viết chương trình Copy file lớn ra các file con
Đầu vào: Tệp có kích thước n Tên file là FileName và một số k <= n
Đầu ra : chia tệp thành k hoặc k + 1 tệp, sử dụng cơ chế đa luồng
Trang 19Tham gia đóng góp
Tài liệu: Lập trình đa tuyến (MULTITHREADING)
Biên tập bởi: Khoa CNTT ĐHSP KT Hưng Yên
URL: http://voer.edu.vn/c/bc908932
Giấy phép: http://creativecommons.org/licenses/by/3.0/
Module: Lập trình đa tuyến (MULTITHREADING)
Các tác giả: Khoa CNTT ĐHSP KT Hưng Yên
URL: http://www.voer.edu.vn/m/67c5818c
Giấy phép: http://creativecommons.org/licenses/by/3.0/
Trang 20Chương trình Thư viện Học liệu Mở Việt Nam
Chương trình Thư viện Học liệu Mở Việt Nam (Vietnam Open Educational Resources – VOER) được hỗ trợ bởi Quỹ Việt Nam Mục tiêu của chương trình là xây dựng kho Tài nguyên giáo dục Mở miễn phí của người Việt và cho người Việt, có nội dung phong phú Các nội dung đểu tuân thủ Giấy phép Creative Commons Attribution (CC-by) 4.0
do đó các nội dung đều có thể được sử dụng, tái sử dụng và truy nhập miễn phí trước hết trong trong môi trường giảng dạy, học tập và nghiên cứu sau đó cho toàn xã hội
Với sự hỗ trợ của Quỹ Việt Nam, Thư viện Học liệu Mở Việt Nam (VOER) đã trở thành một cổng thông tin chính cho các sinh viên và giảng viên trong và ngoài Việt Nam Mỗi ngày có hàng chục nghìn lượt truy cập VOER (www.voer.edu.vn) để nghiên cứu, học tập và tải tài liệu giảng dạy về Với hàng chục nghìn module kiến thức từ hàng nghìn tác giả khác nhau đóng góp, Thư Viện Học liệu Mở Việt Nam là một kho tàng tài liệu khổng lồ, nội dung phong phú phục vụ cho tất cả các nhu cầu học tập, nghiên cứu của độc giả
Nguồn tài liệu mở phong phú có trên VOER có được là do sự chia sẻ tự nguyện của các tác giả trong và ngoài nước Quá trình chia sẻ tài liệu trên VOER trở lên dễ dàng như đếm 1, 2, 3 nhờ vào sức mạnh của nền tảng Hanoi Spring
Hanoi Spring là một nền tảng công nghệ tiên tiến được thiết kế cho phép công chúng dễ dàng chia sẻ tài liệu giảng dạy, học tập cũng như chủ động phát triển chương trình giảng dạy dựa trên khái niệm về học liệu mở (OCW) và tài nguyên giáo dục mở (OER) Khái niệm chia sẻ tri thức có tính cách mạng đã được khởi xướng và phát triển tiên phong bởi Đại học MIT và Đại học Rice Hoa Kỳ trong vòng một thập kỷ qua Kể từ đó, phong trào Tài nguyên Giáo dục Mở đã phát triển nhanh chóng, được UNESCO hỗ trợ và được chấp nhận như một chương trình chính thức ở nhiều nước trên thế giới