117
Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
ột trong những điểm mạnh của hệ điều hành Microsoft Windows là cho phép
nhiều chương trình (tiến trình—process) chạy đồng thời và cho phép mỗi tiến
trình thực hiện nhiều tác vụ đồng thời (bằng nhiều tiểu trình—thread). Chương
này sẽ trình bày cách kiểm soát các tiến trình và các tiểu trình trong các ứng dụng dựa vào các
tính năng do thư viện lớp .NET Framework cung cấp. Các mục trong chương này sẽ trình bày
cách thực hiện các vấn đề sau:
M
Sử dụng các kỹ thuật và các tính năng khác nhau của .NET Framework để tạo các tiểu
trình mới (mục 4.1 đến 4.5).
Kiểm soát quá trình thực thi của một tiểu trình để biết được khi nào nó kết thúc (mục
4.6 và 4.7).
Đồng bộ hóa quá trình thực thi của nhiều tiểu trình (mục 4.8 và 4.9).
Chạy và dừng các tiến trình mới (mục 4.10 và 4.11).
Bảo đảm rằng tại một thời điểm chỉ có thể chạy một thể hiện của ứng dụng (mục 4.12).
1.
1.
Th c thi ph
ng th c v i thread-pool
ự
ươ
ứ ớ
Th c thi ph
ng th c v i thread-pool
ự
ươ
ứ ớ
Bạn cần thực thi một phương thức bằng một tiểu trình trong thread-pool của bộ
thực thi.
Khai báo một phương thức chứa mã lệnh cần thực thi; phương thức này phải trả
về
void
và chỉ nhận một đối số. Sau đó, tạo một thể hiện của ủy nhiệm
System.Threading.WaitCallback
tham chiếu đến phương thức này. Tiếp tục, gọi
phương thức tĩnh
QueueUserWorkItem
của lớp
System.Threading.ThreadPool
, và
truyền thể hiện ủy nhiệm đã tạo làm đối số. Bộ thực thi sẽ xếp thể hiện ủy nhiệm
này vào hàng đợi và thực thi nó khi một tiểu trình trong thread-pool sẵn sàng.
Nếu ứng dụng sử dụng nhiều tiểu trình có thời gian sống ngắn hay duy trì một số lượng lớn
các tiểu trình đồng thời thì hiệu năng có thể giảm sút bởi các chi phí cho việc tạo, vận hành và
hủy các tiểu trình. Ngoài ra, trong một hệ thống hỗ-trợ-đa-tiểu-trình, các tiểu trình thường ở
trạng thái rỗi suốt một khoảng thời gian dài để chờ điều kiện thực thi phù hợp. Việc sử dụng
thread-pool sẽ cung cấp một giải pháp chung nhằm cải thiện tính quy mô và hiệu năng của các
hệ thống hỗ-trợ-đa-tiểu-trình.
.NET Framework cung cấp một hiện thực đơn giản cho thread-pool mà chúng ta có thể truy
xuất thông qua các thành viên tĩnh của lớp
ThreadPool
. Phương thức
QueueUserWorkItem
cho
phép bạn thực thi một phương thức bằng một tiểu trình trong thread-pool (đặt công việc vào
hàng đợi). Mỗi công việc được mô tả bởi một thể hiện của ủy nhiệm
WaitCallback
(tham
chiếu đến phương thức cần thực thi). Khi một tiểu trình trong thread-pool sẵn sàng, nó nhận
công việc kế tiếp từ hàng đợi và thực thi công việc này. Khi đã hoàn tất công việc, thay vì kết
thúc, tiểu trình này quay về thread-pool và nhận công việc kế tiếp từ hàng đợi.
Việc sử dụng thread-pool của bộ thực thi giúp đơn giản hóa việc lập trình hỗ-trợ-đa-tiểu-trình.
Tuy nhiên, cần lưu ý đây là thread-pool được hiện thực đơn giản, chỉ nhằm mục đích sử dụng
chung. Trước khi quyết định sử dụng thread-pool này, cần xem xét các điểm sau: