147
Chương 4: Tiểu trình, tiến trình, và sự đồng bộ
lock (consoleGate) {
// Pulse tất cả các tiểu trình đang chờ.
Monitor.PulseAll(consoleGate);
}
// Nhấn Enter để kết thúc.
Console.WriteLine("Main method complete. Press Enter.");
Console.ReadLine();
}
}
Các lớp thông dụng khác dùng để đồng bộ hóa tiểu trình là các lớp con của lớp
System.Threading.WaitHandle
, bao gồm
AutoResetEvent
,
ManualResetEvent
, và
Mutex
. Thể
hiện của các lớp này có thể ở trạng thái signaled hay unsignaled. Các tiểu trình có thể sử dụng
các phương thức của các lớp được liệt kê trong bảng 4.2 (được thừa kế từ lớp
WaitHandle
) để
đi vào trạng thái
WaitSleepJoin
và đợi trạng thái của một hay nhiều đối tượng dẫn xuất từ
WaitHandle
biến thành signaled.
Bảng 4.2 Các phương thức của WaitHandle dùng để đồng bộ hóa quá trình thực thi của các tiểu
trình
Phương thức
Mô tả
WaitAny
Tiểu trình gọi phương thức tĩnh này sẽ đi vào trạng thái
WaitSleepJoin
và đợi bất kỳ một trong các đối tượng
WaitHandle
thuộc một mảng
WaitHandle
biến thành signaled. Bạn cũng có thể chỉ định giá trị time-
out.
WaitAll
Tiểu trình gọi phương thức tĩnh này sẽ đi vào trạng thái
WaitSleepJoin
và đợi tất cả các đối tượng
WaitHandle
trong một mảng
WaitHandle
biến
thành signaled. Bạn cũng có thể chỉ định giá trị time-out. Phương thức
WaitAllExample
trong mục 4.2 đã trình bày cách sử dụng phương thức
WaitAll
.
WaitOne
Tiểu trình gọi phương thức này sẽ đi vào trạng thái
WaitSleepJoin
và
đợi một đối tượng
WaitHandle
cụ thể biến thành signaled. Phương thức
WaitingExample
trong mục 4.2 đã trình bày cách sử dụng phương thức
WaitOne
.
Điểm khác biệt chính giữa các lớp
AutoResetEvent
,
ManualResetEvent
, và
Mutex
là cách thức
chúng chuyển trạng thái từ signaled thành unsignaled, và tính khả kiến (visibility) của chúng.
Lớp
AutoResetEvent
và
ManualResetEvent
là cục bộ đối với một tiến trình. Để ra hiệu một
AutoResetEvent
, bạn hãy gọi phương thức
Set
của nó, phương thức này chỉ giải phóng một
tiểu trình đang đợi sự kiện.
AutoResetEvent
sẽ tự động trở về trạng thái unsignaled. Ví dụ
trong mục 4.4 đã trình bày cách sử dụng lớp
AutoResetEvent
.