Tôi đang học về đồng thời C++ 11, nơi mà kinh nghiệm trước đây duy nhất của tôi với các nguyên tắc đồng thời trong lớp Hệ điều hành cách đây sáu năm, vì vậy hãy nhẹ nhàng, nếu bạn có thể.C++ 11 std :: condition_variable: chúng ta có thể chuyển khóa của chúng tôi trực tiếp đến chuỗi được thông báo không?
Trong C++ 11, chúng ta có thể viết
std::mutex m;
std::condition_variable cv;
std::queue<int> q;
void producer_thread() {
std::unique_lock<std::mutex> lock(m);
q.push(42);
cv.notify_one();
}
void consumer_thread() {
std::unique_lock<std::mutex> lock(m);
while (q.empty()) {
cv.wait(lock);
}
q.pop();
}
này hoạt động tốt, nhưng tôi bị xúc phạm bởi sự cần thiết phải quấn cv.wait
trong một vòng lặp. Lý do chúng ta cần vòng lặp là rõ ràng với tôi:
Consumer (inside wait()) Producer Vulture
release the lock
sleep until notified
acquire the lock
I MADE YOU A COOKIE
notify Consumer
release the lock
acquire the lock
NOM NOM NOM
release the lock
acquire the lock
return from wait()
HEY WHERE'S MY COOKIE I EATED IT
Bây giờ, tôi tin rằng một trong những điều thú vị về unique_lock
được rằng chúng ta có thể vượt qua nó xung quanh, phải không? Vì vậy, nó sẽ thực sự thanh lịch nếu chúng ta có thể làm điều này thay vì:
Consumer (inside wait()) Producer
release the lock
sleep until notified
acquire the lock
I MADE YOU A COOKIE
notify and yield(passing the lock)
wake(receiving the lock)
return from wait()
YUM
release the lock
Bây giờ không có cách nào cho thread Vulture để swoop trong, bởi vì mutex vẫn bị khóa tất cả các cách I MADE YOU A COOKIE
-YUM
. Ngoài ra, nếu notify()
yêu cầu bạn vượt qua khóa, đó là cách tốt để đảm bảo rằng mọi người thực sự khóa mutex trước khi gọi notify()
(xem Signalling a condition variable (pthreads)).
Tôi khá chắc chắn rằng C++ 11 không có bất kỳ triển khai chuẩn nào cho thành ngữ này. Lý do lịch sử cho điều đó (là nó chỉ là pthreads đã không làm điều đó? Và sau đó tại sao là rằng)? Có một lý do kỹ thuật mà một coder C++ mạo hiểm không thể thực hiện thành ngữ này trong tiêu chuẩn C++ 11, gọi nó có lẽ là my_better_condition_variable
?
Tôi cũng có cảm giác mơ hồ rằng có lẽ tôi đang phát minh lại các ẩn dụ, nhưng tôi không nhớ đủ từ trường để biết liệu đó có chính xác hay không.
Erm, nếu bạn không muốn có một số chủ đề để ăn cookie , tại sao bạn thậm chí còn chạy nó? –
Điểm tốt, giọng điệu của câu hỏi của tôi hơi thiên vị đối với Kền kền. :) Xem, Người tiêu dùng đang có một giấc mơ đẹp. Anh ta sẵn sàng thức dậy với bánh quy và sữa, nhưng nếu anh tỉnh dậy và thấy * không * cookie, anh ta sẽ buồn. Vì vậy, nhà sản xuất có thể cung cấp cookie cho Vulture, nhưng không phải * không sao cho Nhà sản xuất đánh thức Người tiêu dùng bằng cách lắc và hét lên "COOKIE TIME!" và sau đó sẽ "oh, tiếc, Vulture ăn cookie của bạn trong khi tôi đã lắc bạn." Đó không phải là mát mẻ, nhà sản xuất. Đó không phải là mát mẻ. – Quuxplusone
Điều đó không có ý nghĩa. Bạn không thể mong đợi nhiều chủ đề không liên quan không biết các chủ đề khác truy cập cùng một dữ liệu được chia sẻ để hoạt động chính xác. Làm thế nào Vulture bao giờ ăn bất kỳ cookie với giải pháp đề xuất của bạn? –