Jak zaimplementować blokowanie odczytu przy użyciu wątków POSIX
Chciałbym wdrożyć scenariusz producenta / konsumenta, który jest zgodny z interfejsami, które są z grubsza:
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
}
};
W tym przypadku,feed
irun
będzie działać na osobnych wątkach iread
powinno być przeczytaniem (jakrecv
ifread
). Oczywiście, będę potrzebował pewnego rodzaju wzajemnego wykluczenia w moim deque, i będę potrzebował jakiegoś systemu powiadamiania, by o tym poinformowaćread
spróbować ponownie.
słyszęzmienne warunkowe są drogi, ale wszystkie moje doświadczenia związane z wielowątkowością są związane z systemem Windows i ciężko mi jest owijać głowę wokół nich.
Dzięki za pomoc!
(Tak, wiem, że nie jest efektywne zwracanie wektorów. Nie wchodźmy w to.)