2012-06-28 32 views
5

Cách đây một thời gian dài, tôi đã có lỗi trong chương trình của mình. Nguyên nhân gốc là chức năng CBộ hẹn giờ có độ chính xác tốt hơn so với giấc ngủ()

sleep(60); 

sẽ hiếm khi ngủ dưới 60 giây. Hoặc chức năng đã làm cho luồng ngủ hơn 60 giây, nhưng đồng hồ đã được thay đổi tự động bởi hệ điều hành (điều này có vẻ là do lỗi chỉ xảy ra trên XX::00::00), còn được gọi là hiếm khi xảy ra và chỉ vào "giờ tròn" (ngủ shoudl đã kết thúc tại> xh0m0s, nó kết thúc vào x-1h59m59.99*s).
Sau đó, quản lý dự án của tôi đã đi trên một rant như thế nào ông nói triệu lần mà chúng ta chỉ nên sử dụng bộ đếm thời gian, không ngủ. Kể từ thời điểm đó, tôi chấp nhận khái niệm rằng giờ là chính xác hơn ngủ(), nhưng bây giờ tôi cảm thấy rằng tôi nên yêu cầu một số nguồn có thẩm quyền hơn. Vì vậy:

  1. là giờ chính xác hơn ngủ?
  2. (có liên quan) là chúng sâu xuống (ở cấp hệ điều hành) được triển khai bằng các phương pháp khác nhau?
    Tôi biết giờ được sử dụng để thực hiện cuộc gọi lại, chỉ trì hoãn thực hiện chuỗi hiện tại, Im nói về phần thực thi chậm trễ của việc triển khai.

BTW OS là Linux, nhưng tôi quan tâm đến câu trả lời chung nếu có thể.

+0

Trong cả hai trường hợp, nó không phải là một ý tưởng tốt để mong đợi một hoạt động hẹn giờ/ngủ để thực sự tạm dừng trong thời gian nhất định. Hệ điều hành làm tất cả những gì có thể để tôn trọng yêu cầu của bạn, nhưng đôi khi nó sẽ thất bại. Hãy chuẩn bị cho nó. – TheZ

+0

Tôi biết rằng bây giờ, lỗi "sửa chữa" (sau khi người quản lý bình tĩnh lại từ rant giờ của mình) chỉ là thêm một số chậm trễ an toàn. – NoSenseEtAl

+11

Nghe có vẻ như có một vấn đề kiến ​​trúc sâu hơn nếu sự khác biệt +/- 1 giây trong giấc ngủ khiến mọi thứ bị hỏng ... – Rook

Trả lời

2

Không có câu trả lời chung vì lý do đơn giản là không có gì trong tiêu chuẩn C hoặc C++ cung cấp khả năng đưa ứng dụng vào trạng thái ngủ. Vì vậy, cuộc thảo luận vốn sẽ phụ thuộc vào hệ điều hành.

Hàm unix sleep() có độ chi tiết thô. Ngoài ra còn có usleep()nanosleep() có nhiều chi tiết tinh vi hơn. Chức năng select() cũng có thể được sử dụng để đặt ứng dụng vào chế độ ngủ. Chỉ cần chỉ định thời gian chờ và không có bộ mô tả tệp.

Lưu ý # 1: Tương tác giữa sleep(), usleep(), nanosleep(), dấu hiệu và báo thức không được chỉ định.

Lưu ý # 2: Đừng mong đợi bất kỳ cơ chế nào trong số này có độ chính xác của đồng hồ nguyên tử.

3

Bộ hẹn giờ chắc chắn chính xác hơn ngủ. Ngủ có nghĩa là chỉ là một thước đo thô bao lâu cho đến khi công việc lên lịch làm lại một chủ đề hoặc quá trình. Những thay đổi đối với đồng hồ hệ thống, lịch biểu tác vụ quá tải, vv sẽ ảnh hưởng đến thời gian ngủ thực sự ngủ.

Bộ hẹn giờ sẽ đo thời gian chính xác hơn. Nói chung một bộ đếm thời gian sẽ đo thời gian chính xác. Có hai loại bộ đếm thời gian - những bộ đếm dựa trên đồng hồ hệ thống giống như các hàm trong "time.h". Những thứ đó sẽ bị ảnh hưởng bởi những thứ như thay đổi đối với đồng hồ hệ thống. Ví dụ - nếu bạn thay đổi thời gian hệ thống, chuyển từ giờ tiết kiệm ánh sáng ban ngày, hoặc đình chỉ máy vv thời gian đo thực tế có thể khác với thời gian thực.

Loại đồng hồ khác là bộ hẹn giờ có độ phân giải cao dựa trên các dấu CPU. Đây là những bộ tính giờ như QueryPerformanceTimer trên windows và clock_gettime() trên Linux. Đây chỉ đơn giản là đếm chu kỳ CPU.Chúng sẽ không bị ảnh hưởng bởi các thay đổi đối với bộ hẹn giờ hệ thống - nhưng chúng sẽ biến mất khỏi thời gian thực theo hai cách:

  1. Thời gian sẽ bị lệch trong khoảng thời gian dài vì độ phân giải không chính xác thời gian theo cách này sẽ gây ra thời gian cpu trôi dạt từ thời gian thực.
  2. Nếu máy bị treo CPU dừng và bộ hẹn giờ sẽ không tính đến điều này.

Điều bạn muốn làm là ngủ trong một khoảng thời gian ngắn hơn nhiều và sử dụng đồng hồ có độ phân giải phù hợp. Ví dụ. nếu bạn cần ngủ ít hơn một vài phút, bạn nên sử dụng bộ hẹn giờ có độ phân giải cao. Ngủ thường xuyên hơn 100 lần so với nhu cầu của bạn và kiểm tra thời gian trôi qua mỗi khi giấc ngủ trở lại để xem thời gian trôi qua đã trôi qua chưa. Nếu bạn cần ngủ nhiều hơn một vài phút thì hãy làm như vậy nhưng với functon trong thời gian.h để kiểm tra thời gian trôi qua.

Nếu bạn cần chính xác 100% với thời gian bạn có thể cần phần cứng chuyên dụng hoặc để kiểm tra định kỳ theo thời gian thực trên máy chủ thời gian trực tuyến - như đồng hồ nguyên tử của hải quân. (http://tycho.usno.navy.mil/ntp.html)

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