2013-02-13 34 views
9

Như có thể được đọc tại địa chỉ:boost :: deadline_timer có thể thất bại khi đồng hồ hệ thống được sửa đổi

https://svn.boost.org/trac/boost/ticket/3504

một deadline_timer rằng thờ gian tạm ngưng theo định kỳ và được triển khai sử dụng deadline_timer :: expires_at() (như ví dụ ở Boost Timer Tutorial, 3th example) có thể sẽ thất bại nếu thời gian hệ thống được sửa đổi (ví dụ, sử dụng lệnh ngày, nếu hệ điều hành của bạn là Linux).

Có cách nào đơn giản và thuận tiện để thực hiện thao tác này ngay bây giờ không, bằng cách sử dụng Boost? Tôi không muốn sử dụng deadline_timer :: expires_from_now() vì tôi có thể xác minh rằng nó ít chính xác hơn "thủ công" cập nhật thời gian hết hạn.

Là giải pháp thời gian tôi quyết định, trước khi đặt giá trị expires_at mới, hãy tính khoảng thời gian giữa bây giờ() và expires_at(). Nếu nó tăng hơn gấp đôi mức trễ định kỳ, thì tôi đặc biệt sử dụng expires_from_now() để đồng bộ hóa với thời gian tuyệt đối mới.

+3

Giải pháp tạm thời, chơi chữ đẹp :) – Thomas

Trả lời

9

Tăng 1.49+, Boost.Asio cung cấp steady_timer. Bộ hẹn giờ này sử dụng chrono::steady_clock, một đồng hồ đơn điệu không bị ảnh hưởng bởi những thay đổi đối với đồng hồ hệ thống.

Nếu bạn không thể sử dụng Boost 1.49+, sau đó kiểm tra bộ hẹn giờ hoặc đồng hồ để thay đổi là giải pháp thay thế hợp lý. Trong khi nó là một chi tiết thực hiện, Boost.Asio có thể giới hạn lượng thời gian chờ đợi trên một sự kiện trong lò phản ứng của nó, để nó có thể định kỳ phát hiện các thay đổi cho thời gian hệ thống. Ví dụ: việc triển khai lò phản ứng sử dụng epoll sẽ đợi tối đa 5 phút. Do đó, mà không cần phải ngắt lời trên lò phản ứng (chẳng hạn như thiết lập thời gian hết hạn mới trên bộ hẹn giờ), có thể mất Boost.Asio tối đa 5 phút trước khi phát hiện thay đổi về thời gian của hệ thống.

Các vấn đề liên quan