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.)

questionAnswers(6)

yourAnswerToTheQuestion