Tôi đang học điều kiện chờ đợi và chờ đợi. Theo như tôi có thể nói với một tiểu trình đang chờ điển hình là như thế này:Điều kiện chờ đợi và chờ đợi
pthread_mutex_lock(&m);
while(!condition)
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Những gì tôi không thể hiểu là tại sao dòng while(!condition)
là cần thiết ngay cả khi tôi sử dụng pthread_cond_signal()
thức dậy thread.
tôi có thể hiểu rằng nếu tôi sử dụng pthread_cond_broadcast()
Tôi cần phải kiểm tra điều kiện, bởi vì tôi thức dậy tất cả đề chờ đợi và một trong số họ có thể làm cho tình trạng sai một lần nữa trước khi mở khóa mutex (và do đó chuyển thi khác đều thức dậy mà không nên thực hiện tại thời điểm đó). Nhưng nếu tôi sử dụng pthread_cond_signal()
Tôi thức dậy chỉ một chủ đề để điều kiện phải đúng. Vì vậy, mã có thể trông giống như sau:
pthread_mutex_lock(&m);
pthread_cond_wait(&cond, &m);
// Thread stuff here
pthread_mutex_unlock(&m);
Tôi đọc điều gì đó về tín hiệu giả có thể xảy ra. Đây có phải là (và chỉ này) lý do? Tại sao tôi nên có những người hát giả mạo? Hoặc có cái gì khác tôi không nhận được?
tôi giả sử mã tín hiệu là như thế này:
pthread_mutex_lock(&m);
condition = true;
pthread_cond_signal(&cond); // Should wake up *one* thread
pthread_mutex_unlock(&m);
chính xác. được bình chọn. điều này sẽ nhận được nhiều sự chú ý hơn câu trả lời được chấp nhận. –