Tôi gặp sự cố lạ. Tôi có đoạn mã sau:pthread_cond_timedwait trả lại ngay lập tức
dbg("condwait: timeout = %d, %d\n",
abs_timeout->tv_sec, abs_timeout->tv_nsec);
ret = pthread_cond_timedwait(&q->q_cond, &q->q_mtx, abs_timeout);
if (ret == ETIMEDOUT)
{
dbg("cond timed out\n");
return -ETIMEDOUT;
}
dbg
cuộc gọi gettimeofday
trước mỗi dòng và prepends những phù hợp với thời gian. Nó là kết quả trong đầu ra sau đây:
7.991151: condwait: timeout = 5, 705032704
7.991158: cond timed out
Như bạn có thể thấy, chỉ có 7 micro thông qua vào giữa hai dòng debug, nhưng pthread_cond_timedwait
trở ETIMEDOUT
. Làm thế nào điều này có thể xảy ra? Tôi thậm chí đã thử đặt đồng hồ thành một thứ khác khi khởi tạo biến số:
int ret;
ret = pthread_condattr_init(&attributes);
if (ret != 0) printf("CONDATTR INIT FAILED: %d\n", ret);
ret = pthread_condattr_setclock(&attributes, CLOCK_REALTIME);
if (ret != 0) printf("SETCLOCK FAILED: %d\n", ret);
ret = pthread_cond_init(&q->q_cond, &attributes);
if (ret != 0) printf("COND INIT FAILED: %d\n", ret);
(không có thông báo lỗi nào được in ra). Tôi đã thử cả hai CLOCK_REALTIME
và CLOCK_MONOTONIC
.
Mã này là một phần của hàng đợi chặn. Tôi cần chức năng như vậy mà nếu không có gì được đưa vào hàng đợi này trong 5 giây, cái gì khác xảy ra. Các mutex và cond đều được khởi tạo, vì hàng đợi chặn hoạt động tốt nếu tôi không sử dụng pthread_cond_timedwait
.
Tôi hiểu rồi. Bạn có thể sử dụng pthread_get_expiration_np() để tìm ra thời gian abs là gì. – Claudiu
@Claudiu pthread_get_expiration_np() không khả dụng trên GNU/Linux của tôi. Thay vào đó, tôi phải: 'thời gian bây giờ; gettimeofday (& bây giờ, NULL); long int abstime_ns_large = now.tv_usec * 1000 + delay_ns; timespec abstime = {now.tv_sec + (abstime_ns_large/1000000000), abstime_ns_large% 1000000000}; 'trong đó delay_ns là độ trễ mong muốn trong nano giây.Sau đó sử dụng abstime trong cuộc gọi pthread_cond_timedwait của bạn. –