Trong C++ 11, chức năng timeout *_until
chỉ hoạt động như mong đợi nếu đồng hồ ổn định (tức là một đồng hồ chỉ di chuyển về phía trước với tốc độ không thay đổi) được sử dụng. Bởi vì system_clock
không phải là một chiếc đồng hồ ổn định, đó có nghĩa là mã như thế này có thể cư xử khá ngạc nhiên:Khi nào nó thích hợp để sử dụng hàm C++ 11 * _until timeout thay vì hàm * _for tương ứng?
using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
này sẽ làm cho thread hiện hành vào giấc ngủ trong vòng 10 giây trừ khi đồng hồ hệ thống được điều chỉnh trong thời gian ngủ, ví dụ như, cho thời gian tiết kiệm ánh sáng ban ngày. Nếu đồng hồ được đặt trở lại một giờ trong khi ngủ, luồng hiện tại sẽ ngủ trong một giờ và 10 giây.
Từ những gì tôi có thể biết, mỗi hàm thời gian chờ *_until
trong C++ 11 có chức năng *_for
tương ứng mất một khoảng thời gian thay vì một dấu thời gian. Ví dụ, đoạn code trên có thể được viết lại như sau:
using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
Các *_for
chức năng không cần phải lo lắng về đồng hồ mà có được điều chỉnh trong khi hàm được thực hiện, bởi vì họ chỉ nói bao lâu để chờ đợi, không phải những gì thời gian nó được cho là khi thời gian chờ kết thúc.
Sự cố này ảnh hưởng nhiều đến các chức năng ngủ, vì điều này cũng đúng cho thời gian chờ dựa trên thời gian chờ và các chức năng try_lock.
Tình hình duy nhất mà tôi có thể hình dung nó làm cho cảm giác sử dụng một chức năng *_until
với một đồng hồ không ổn định sẽ là khi bạn muốn để có những điều chỉnh đồng hồ vào tài khoản, ví dụ, bạn muốn ngủ cho đến thứ tư tới tại 3: 30 giờ sáng, ngay cả khi có thay đổi hoặc từ giờ tiết kiệm ánh sáng ban ngày từ nay đến giờ. Có các tình huống khác trong đó các chức năng *_until
có ý nghĩa hơn các chức năng *_for
không? Nếu không, có an toàn khi nói rằng, nói chung, chức năng thời gian chờ *_for
có nên được ưu tiên hơn các chức năng *_until
không?
Điều đó có phụ thuộc vào _steadiness_ của _clock_ không? «Wait_for' và' wait_until' có thực sự có ý định hoạt động khác trong việc xử lý 'nhảy đồng hồ' không? –
@ K-ballo: Đúng vậy, đó là lý do tại sao tôi đề cập cụ thể sự ổn định của đồng hồ và system_clock không ổn định. Các hàm '_for' và' _until' hoạt động khác nhau liên quan đến điều chỉnh đồng hồ, nhưng những gì _intention_ không rõ ràng với tôi. – KnowItAllWannabe
_steadiness_ của 'system_clock' thực sự phụ thuộc vào việc triển khai thực hiện. –