Chỉnh sửa: Tôi muốn bào chữa sự điên rồ tạm thời cho việc hỏi câu hỏi này, nhưng nó có ý nghĩa vào thời điểm đó (xem chỉnh sửa 2 bên dưới).WaitHandle.WaitAny và Semaphore lớp
Đối với dự án .NET 3.5, tôi có hai loại tài nguyên (R1 và R2) mà tôi cần kiểm tra tính khả dụng của. Mỗi loại tài nguyên có thể có (nói) 10 trường hợp bất kỳ lúc nào.
Khi một trong hai loại tài nguyên trở nên khả dụng, chuỗi công nhân của tôi cần phải thức dậy (có một số lượng đề tài thay đổi). Trong quá trình thực hiện trước đó, chỉ có một loại tài nguyên, mà tôi đã sử dụng Semaphore để kiểm tra tính khả dụng.
Bây giờ tôi cần phải chờ hai Semaphores riêng biệt (S1 và S2) theo dõi tính khả dụng của tài nguyên.
WaitHandle[] waitHandles = new WaitHandle[] { s1, s2 };
int signalledHandle = WaitHandle.WaitAny(waitHandles);
switch (signalledHandle)
{
case 0:
// Do stuff
s1.Release();
case 1:
// Do stuff
s2.Release();
}
Tuy nhiên, có một vấn đề với điều này. Từ các tài liệu MSDN trên WaitAny
:
Nếu có nhiều hơn một đối tượng trở nên hiệu trong suốt cuộc gọi, giá trị trả về là chỉ số mảng của đối tượng hiệu với giá trị chỉ số nhỏ nhất của tất cả các hiệu đối tượng .
Điều này cho thấy rằng tôi có thể giảm cả số lượng Semaphore của mình xuống 1 sau khi gọi WaitAny
. Bởi vì signalledHandle
sẽ chỉ ra rằng s1 đã được báo hiệu, tôi sẽ bắt đầu sử dụng tài nguyên R1 và phát hành nó khi tôi hoàn tất. Tuy nhiên, vì tôi không biết liệu S2 có được báo hiệu hay không, tính khả dụng trên tài nguyên này hiện có thể bị tắt. Nếu điều này xảy ra 10 lần, Semaphore của tôi sẽ vĩnh viễn 'trống' và tài nguyên R2 sẽ không còn được sử dụng nữa.
Cách tốt nhất để giải quyết vấn đề này là gì? Tôi có nên chuyển từ sử dụng hai semaphores sang các bộ đếm đơn giản và một AutoResetEvent để báo hiệu khi một trong hai bộ đếm được thay đổi không? Tôi có thiếu một số cách tiếp cận thanh lịch hơn?
Sửa 1:
Theo Ravadre, chỉ có một trong những Semaphores sẽ thực sự được thay đổi sau khi WaitAny
. Sửa đổi một chút ví dụ của anh ta dường như xác nhận điều này, nhưng liệu có ai có thể chỉ cho tôi một số tài liệu chính thức xác định điều này không?
Chỉnh sửa 2:
Tôi đã nghĩ về điều này trên đường về nhà. Chỉ sau đó tôi mới nhận ra rằng điều này phải đúng với WaitAny
để sử dụng. Vấn đề này sẽ không bị hạn chế đối với Semaphores, nhưng chỉ là về bất kỳ loại đối tượng đồng bộ hóa nào, làm cho WaitAny
thực tế vô ích.
Tôi đã thêm nguồn có giá trị (mặc dù không chính thức) mà bạn có thể muốn kiểm tra. –