Ich möchte einen Erzeuger/Verbraucher-Szenario implementieren, die Schnittstellen, die grob sind gehorcht:Wie implementieren Blockierung lesen POSIX Threads
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
und run
auf separaten Threads ausgeführt werden und read
sollte ein blockierender Lesevorgang sein (wie recv
und fread
). Offensichtlich brauche ich eine Art gegenseitigen Ausschluss auf meiner Deque, und ich werde eine Art von Benachrichtigungssystem benötigen, um read
zu informieren, um es erneut zu versuchen.
Ich höre Zustand Variablen sind der Weg zu gehen, aber alle meine Multithreading-Erfahrung liegt bei Windows und habe eine harte Zeit, um meinen Kopf um sie zu wickeln.
Danke für jede Hilfe!
(Ja, ich weiß, dass es ineffizient ist Vektoren zurückzukehren. Lassen Sie uns nicht in das bekommen.)
Das sieht sehr gut aus. Eine Anmerkung (nur eine Verfeinerung), aber die meisten Seiten sagen, dass Sie die Zustandsvariable selbst mit einem Mutex schützen müssen, um Rennbedingungen zu verhindern. Multithreading macht Spaß, oder? –
Die Zustandsvariable ist durch einen Mutex geschützt. In beiden Fällen, read() und feed(), müssen Sie die Sperre übernehmen, bevor Sie etwas mit der Bedingungsvariablen machen können. –
Entschuldigung. Ich habe es in deinem Code verpasst. Sehr schön. –