(Đăng ngày 19/10/2007) ThreadState là vô giá để gỡ lỗi hoặc lập hồ sơ. Tuy nhiên, nó kém phù hợp để phối hợp nhiều luồng, bởi vì không có cơ chế nào tồn tại để người ta có thể kiểm tra một ThreadState và sau đó hành động dựa trên thông tin đó, mà ThreadState không có khả năng thay đổi trong thời gian tạm thời.
- Phần 1: Tổng quan và khái niệm
- Phần 2: Tạo và bắt đầu chủ đề
- Phần 3: Cơ bản về đồng bộ hóa
- Phần 4: Khóa và an toàn chỉ
- Phần 5: Ngắt và hủy bỏ
Người ta có thể truy vấn trạng thái thực thi của một luồng thông qua thuộc tính ThreadState của nó . Hình 1 cho thấy một “lớp” của kiểu liệt kê ThreadState. ThreadState được thiết kế khủng khiếp, trong đó nó kết hợp ba “lớp” trạng thái bằng cách sử dụng cờ bitwise, các thành viên trong mỗi lớp được loại trừ lẫn nhau. Đây là tất cả ba lớp:
- trạng thái đang chạy / chặn / hủy bỏ (như trong Hình 1)
- trạng thái nền / nền trước ( ThreadState.Background )
- tiến độ tạm ngưng thông qua phương thức Tạm ngưng không được dùng nữa (ThreadState.SuspendRequested và ThreadState.Suspended)
Về tổng thể, ThreadState là sự kết hợp theo từng bit của không hoặc một thành viên từ mỗi lớp! Dưới đây là một số ThreadState mẫu:
Chưa khởi
động đang chạy
WaitSleepJoin
Nền,
Yêu cầu tạm ngừng chưa khởi động, Nền, WaitSleepJoin
(Bảng liệt kê có hai thành viên không bao giờ được sử dụng, ít nhất là trong triển khai CLR hiện tại: StopRequested và Aborted )
Để làm phức tạp thêm vấn đề, ThreadState.Running có giá trị cơ bản là 0, vì vậy kiểm tra sau không hoạt động:
if ((t.ThreadState & ThreadState.Running)> 0) …
và thay vào đó, người ta phải kiểm tra một luồng đang chạy bằng cách loại trừ, hoặc cách khác, sử dụng thuộc tính IsAlive của luồng đó . IsAlive, tuy nhiên, có thể không phải là những gì bạn muốn. Nó trả về true nếu luồng bị chặn hoặc bị treo (lần duy nhất nó trả về false là trước khi luồng bắt đầu và sau khi kết thúc).
Giả sử một người loại bỏ các phương thức Tạm ngưng và Tiếp tục không được dùng nữa , người ta có thể viết một phương thức trợ giúp loại bỏ tất cả trừ các thành viên của lớp đầu tiên, cho phép thực hiện các bài kiểm tra bình đẳng đơn giản. Trạng thái nền của một luồng có thể được lấy độc lập thông qua thuộc tính IsBackground của nó , vì vậy chỉ lớp đầu tiên thực sự có thông tin hữu ích:
public static ThreadState SimpleThreadState (ThreadState ts)
{
return ts & (ThreadState.Aborted | ThreadState.AbortRequested |
ThreadState.Stopped | ThreadState.Unstarted |
ThreadState.WaitSleepJoin);
}
ThreadState là vô giá để gỡ lỗi hoặc lập hồ sơ. Tuy nhiên, nó kém phù hợp để phối hợp nhiều luồng, bởi vì không có cơ chế nào tồn tại để người ta có thể kiểm tra một ThreadState và sau đó hành động dựa trên thông tin đó, mà ThreadState không có khả năng thay đổi trong thời gian tạm thời.
(Sưu tầm)
FPT Aptech trực thuộc Tổ chức Giáo dục FPT có hơn 25 năm kinh nghiệm đào tạo lập trình viên quốc tế tại Việt Nam, và luôn là sự lựa chọn ưu tiên của các sinh viên và nhà tuyển dụng. |