2013-01-09 16 views
16

pthread_mutex_timedlock documentation nói rằng abs_timeout mất CLOCK_REALTIME. Tuy nhiên, tất cả chúng ta đều biết rằng nó không thích hợp cho việc định thời gian một thời gian cụ thể (do điều chỉnh thời gian hệ thống).CLOCK_MONOTONIC và pthread_mutex_timedlock/pthread_cond_timedwait

Có cách nào để thực hiện thời gian chờ khóa pthread trên CLOCK_MONOTONIC có thể di chuyển không? Cũng vậy với pthread_cond_timedwait.

+0

Không phù hợp. Bạn chỉ cần đặt múi giờ miền địa phương của ứng dụng thành UTC. –

+4

@ MahmoudAl-Qudsi No. Điều đó không ngăn đồng hồ thời gian thực của bạn thay đổi. –

+0

Bạn có thể sử dụng một chuỗi đồng hồ đồng hồ phát sóng tất cả các biến có điều kiện đã đăng ký nếu đồng hồ nhảy lùi lại. –

Trả lời

17

Sau khi xem tài liệu và pthread.h, tôi không thể tìm cách tạo pthread_mutex_timedlock sử dụng CLOCK_MONOTONIC vì vậy tôi cho rằng đó không phải là (hiện tại) có thể. Đối với pthread_cond_timedwait, tuy nhiên, bạn có thể sử dụng mã như thế này:

pthread_condattr_t attr; 
pthread_cond_t cond; 
/* ... */ 
pthread_condattr_init(&attr); 
pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); 
pthread_cond_init(&cond, &attr); 

tôi đã bỏ qua mã lỗi kiểm tra cho rõ ràng, nhưng tất nhiên bạn nên làm điều đó.

Tôi giả sử rằng CLOCK_REALTIME được sử dụng vì luôn có sẵn trong khi nguyên tắc CLOCK_MONOTONIC là tùy chọn. Ngoài ra, tôi tự hỏi nếu thiết lập thời gian chờ tuyệt đối làm cho nó dễ dàng hơn để phục hồi sau khi các cuộc gọi hệ thống bị gián đoạn bởi tín hiệu và muốn. Tuy nhiên, nó có vẻ khá không nhất quán rằng đồng hồ có thể được đặt trong một số trường hợp và không phải những người khác - có thực sự cần phải là một pthread_mutexattr_setclock(), nhưng than ôi có vẻ không phải là một. Tôi đoán bạn sẽ chỉ phải hy vọng ai đó không đặt đồng hồ!

+3

Điều này rất tốt trên Linux. 'pthread_condattr_setclock' không khả dụng trên OS X và tôi không thể tìm thấy giải pháp hoạt động trên OS X. – andrewrk

+0

Có vẻ như những người khác cũng đã tham gia vào quá trình này: https://github.com/nanomsg/nanomsg/issues/ 10 – Cartroo

+0

Tôi sắp thực hiện một số thử nghiệm, nhưng tôi có thể đã vấp vào một giải pháp ở đây: http://stackoverflow.com/questions/11338899/are-there-any-well-behaved-posix-interval-timers/ 31174803 # 31174803 – andrewrk

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