Implementieren des Blockierens von Lesevorgängen mithilfe von POSIX-Threads

Ich möchte ein Produzenten- / Konsumentenszenario implementieren, das sich an Schnittstellen orientiert, die ungefähr wie folgt aussehen:

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
    }
};

In diesem Fall,feed undrun läuft auf separaten Threads undread sollte ein blockierender Lesevorgang sein (wierecv undfread). Offensichtlich brauche ich eine Art gegenseitigen Ausschluss für meine Deque, und ich brauche eine Art Benachrichtigungssystem, um zu informierenread nochmal versuchen.

ich höreBedingungsvariablen sind der Weg zu gehen, aber alle meine Multithreading-Erfahrung liegt bei Windows und es fällt mir schwer, meinen Kopf um sie zu wickeln.

Danke für jede Hilfe!

(Ja, ich weiß, dass es ineffizient ist, Vektoren zurückzugeben. Lassen Sie uns nicht darauf eingehen.)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage