Tôi muốn thực hiện một kịch bản sản xuất/tiêu dùng tuân theo giao diện mà là khoảng:Làm thế nào để thực hiện chặn đọc sử dụng POSIX đề
class Consumer {
private:
vector<char> read(size_t n) {
// If the internal buffer has `n` elements, then dequeue them
// Otherwise wait for more data and try again
}
public:
void run() {
read(10);
read(4839);
// etc
}
void feed(const vector<char> &more) {
// Safely queue the data
// Notify `read` that there is now more data
}
};
Trong trường hợp này, feed
và run
sẽ chạy trên chủ đề riêng biệt và read
nên là chặn đọc (như recv
và fread
). Rõ ràng, tôi sẽ cần một số loại trừ lẫn nhau trên deque của tôi, và tôi sẽ cần một số loại hệ thống thông báo để thông báo read
để thử lại.
Tôi nghe thấy biến điều kiện là cách để thực hiện, nhưng tất cả trải nghiệm đa luồng của tôi đều nằm trong Windows và có một khoảng thời gian khó khăn bao quanh đầu tôi.
Cảm ơn bạn đã trợ giúp!
(Vâng, tôi biết đó là hiệu quả để trở vectơ. Đừng đi vào đó.)
Điều này trông rất đẹp. Một lưu ý (chỉ là một sàng lọc), nhưng hầu hết các trang web nói rằng bạn cần phải bảo vệ biến điều kiện chính nó với một mutex để ngăn chặn điều kiện chủng tộc. Đa luồng là vui, phải không? –
Biến điều kiện được bảo vệ bởi một mutex. Trong cả hai trường hợp read() và feed(), bạn phải lấy khóa trước khi bạn có thể làm bất cứ điều gì với biến điều kiện. –
Xin lỗi về điều đó. Tôi đã bỏ lỡ nó trong mã của bạn. Rất đẹp. –