2011-10-14 40 views
8

Giả sử bạn có mã nàyTại sao bạn cần một vòng lặp while trong khi chờ đợi một biến trạng

pthread_mutex_lock(&cam->video_lock); 
while(cam->status == WAIT_DISPLAY) // <-- Why is this a 'while' and not an 'if'? 
    pthread_cond_wait(&cam->video_cond, &cam->video_lock); 
pthread_mutex_unlock(&cam->video_lock); 

Câu hỏi của tôi là, tại sao bạn cần một vòng lặp trong khi ở đây. Sẽ không pthread_cond_wait chỉ cần đợi cho đến khi tín hiệu chỉ báo tín hiệu cam_video_cond? OK, tôi biết bạn có thể có một trường hợp CAM-> Tình trạng không bằng WAIT_DISPAY khi pthread_cond_wait được gọi, nhưng trong trường hợp đó bạn chỉ có thể kiểm tra xem nó thông qua một nếu điều kiện hơn là sử dụng khi.

Tôi có thiếu gì đó ở đây không? Sự hiểu biết của tôi về pthread_cond_wait là nó chỉ đợi vô hạn nếu cam_video_cond không được báo hiệu. Hơn nữa, nó mở khóa các cam_video_lock mutex khi được gọi, nhưng khi điều kiện được báo hiệu, trước khi trở về, nó sẽ chuyển đổi cam_video_lock. Tôi có đúng không?

+0

Cùng một câu hỏi tại đây, http://www.unix.com/programming/149791-condition-variables.html – MetallicPriest

+0

[Báo thức giả] (http://en.wikipedia.org/wiki/Spurious_wakeup) –

Trả lời

17

Đó là khuyến cáo rằng tất cả các chủ đề kiểm tra điều kiện sau khi trở về từ pthread_cond_wait vì có nhiều lý do điều kiện có thể không đúng. Một trong những lý do này là một sự thức tỉnh giả; nghĩa là, một chuỗi có thể bị đánh thức ngay cả khi không có luồng nào báo hiệu điều kiện .

Nguồn: Spurious wakeup

2

Vì lý do hiệu suất, API POSIX cho phép hệ điều hành khởi động luồng của bạn ngay cả khi điều kiện chưa được đáp ứng (được gọi là spurious wakeup).

9

wakeups giả là một lý do, nhưng wakeups hợp pháp nhưng không liên quan là khác.

xem xét:

  1. Bạn đặt một công việc trên một hàng đợi.

  2. Bạn đánh dấu sự biến điều kiện, thức dậy chủ đề A.

  3. Bạn đặt một công việc trên một hàng đợi.

  4. Bạn đánh dấu sự biến điều kiện, thức dậy chủ đề B.

  5. Chủ đề A được lên kế hoạch, thực hiện các công việc đầu tiên.

  6. Chủ đề A tìm hàng đợi không trống và thực hiện công việc thứ hai.

  7. Chủ đề B được lên lịch, đã được đánh thức nhưng thấy hàng đợi vẫn trống.

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