Spurious wakup được nhiều nền tảng cho phép. Để chống lại điều đó, chúng tôi viết cơ chế lặp bên dưới:Điều kiện condition_variable :: wait_for() đối phó với các lần đánh thức giả mạo như thế nào?
while(ContinueWaiting())
cv.wait(lock); // cv is a `std::conditional_variable` object
Điều tương tự cũng dễ hiểu đối với conditional_variable::wait_until()
.
Nhưng nhìn vào bên dưới Ví dụ:
const auto duration = Returns_10_seconds();
while(!Predicate())
cv.wait_for(lock, duration);
Hãy tưởng tượng rằng, wakeup giả xảy ra tại 1 giây. Thời gian chờ chưa đạt đến.
Nó có chờ thêm 10 giây nữa không? Điều này sẽ dẫn đến vòng lặp vô hạn, mà tôi chắc chắn không nên xảy ra. Từ mã nguồn, nội bộ wait_for()
gọi wait_until()
.
Tôi muốn hiểu, làm cách nào để wait_for()
xử lý các lần đánh thức giả mạo?
Nó không. Bạn phải tự mình kiểm tra hoặc sử dụng tình trạng quá tải thực hiện nó cho bạn (một trong đó có một vị từ). –
@MaiLongdong, biến vị ngữ chỉ được sử dụng để chống lại các lần đánh thức như vậy. Ngay cả 'wait_for()' nếu nó hoạt động tốt trong nền tảng của tôi, không đảm bảo rằng nó sẽ hoạt động ở khắp mọi nơi, bởi vì wakesups giả là nền tảng phụ thuộc. – iammilind
Nếu bạn không muốn 'wait_for' 10 giây sử dụng' wait_until' 'now()' + 10 giây :-) –