Dễ bay hơi không đủ tốt, nhưng thực tế nó sẽ luôn hoạt động vì bộ lập lịch hệ điều hành sẽ luôn luôn có khóa. Và sẽ làm việc tốt trên một lõi với một mô hình bộ nhớ mạnh mẽ, giống như x86 mà đốt cháy rất nhiều nước để giữ cho bộ nhớ cache được đồng bộ giữa các lõi.
Vì vậy, vấn đề thực sự chỉ là tốc độ một luồng sẽ phản hồi yêu cầu dừng. Nó rất dễ dàng để đo lường, chỉ cần bắt đầu một đồng hồ bấm giờ trong chủ đề kiểm soát và ghi lại thời gian sau khi vòng lặp while trong chuỗi công nhân. Kết quả tôi đo từ lặp đi lặp lại lấy 1000 mẫu và lấy trung bình, lặp đi lặp lại 10 lần:
volatile bool, x86: 550 nanoseconds
volatile bool, x64: 550 nanoseconds
ManualResetEvent, x86: 2270 nanoseconds
ManualResetEvent, x64: 2250 nanoseconds
AutoResetEvent, x86: 2500 nanoseconds
AutoResetEvent, x64: 2100 nanoseconds
ManualResetEventSlim, x86: 650 nanoseconds
ManualResetEventSlim, x64: 630 nanoseconds
Ghi chú rằng các kết quả cho bool dễ bay hơi rất khó có thể tìm thấy tốt trên một bộ xử lý với một mô hình bộ nhớ yếu, như ARM hoặc Itanium. Tôi không có ai để kiểm tra.
Rõ ràng có vẻ như bạn muốn ưu tiên ManualResetEventSlim, mang đến sự hoàn hảo và đảm bảo tốt.
Một lưu ý với những kết quả này, chúng được đo bằng chuỗi công nhân chạy vòng lặp nóng, liên tục kiểm tra điều kiện dừng và không thực hiện bất kỳ công việc nào khác. Đó không phải là một kết hợp tốt với mã thực, một chuỗi thường sẽ không kiểm tra điều kiện dừng thường xuyên. Mà làm cho sự khác biệt giữa các kỹ thuật này phần lớn là không quan trọng.
Nguồn
2012-08-15 01:17:03
Tôi sẽ sử dụng bộ hẹn giờ chứ không phải ngủ. Để kết thúc, bạn có thể dừng bộ hẹn giờ. – Servy
Tôi đã thêm một số quan sát để có thể trả lời, về cơ bản tôi không nghĩ rằng những đoạn mã này làm những gì bạn muốn. – Jodrell