ich folgendes Szenario haben:Nicht alle Fäden condition_variable.notify_all gemeldet()
condition_variable cv;
mutex mut;
// Thread 1:
void run() {
while (true) {
mut.lock();
// create_some_data();
mut.unlock();
cv.notify_all();
}
}
// Thread 2
void thread2() {
mutex lockMutex;
unique_lock<mutex> lock(lockMutex);
while (running) {
cv.wait(lock);
mut.lock();
// copy data
mut.unlock();
// process data
}
}
// Thread 3, 4... - same as Thread 2
Ich betreibe Thread 1 die ganze Zeit neue Daten zu erhalten. Andere Threads warten mit condition_variable, bis neue Daten verfügbar sind, kopieren sie dann und arbeiten daran. Die von Threads ausgeführte Arbeit unterscheidet sich in der Zeit, die bis zum Ende benötigt wird. Die Idee ist, dass Threads nur dann neue Daten erhalten, wenn sie mit dem alten fertig sind. Daten, die in der Zwischenzeit erhalten wurden, dürfen "vermisst" werden. Ich verwende keinen geteilten Mutex (nur um auf Daten zuzugreifen), weil ich nicht möchte, dass Threads voneinander abhängen.
Oben Code funktioniert gut auf Windows, aber jetzt ich es auf Ubuntu laufen und ich bemerkte, dass nur ein Thread benachrichtigt wird, wenn notify_all() aufgerufen wird und die anderen nur hängt an wait(). Warum ist das? Benötigt Linux einen anderen Ansatz für die Verwendung von condition_variable?
'Ich benutze keinen geteilten Mutex (nur um auf Daten zuzugreifen), weil ich nicht möchte, dass Threads voneinander abhängen. - Aber die Verwendung der Bedingungsvariablen ** erfordert ** geteilten Mutex. Kein anderer Weg. – Tsyvarev