Lock-Frei und doch Strom sparend?
Verfasst: 26.02.2016, 21:32
Hi Leute,
ich experimentiere gerade etwas mit einem parallelen Job System herum. Mehrere Producer erzeugen Jobs die in einer Queue abgelegt, und dann von mehreren Consumern abgearbeitet werden. Streng genommen sind in meinem Fall die Producer und Consumer die gleichen Threads aber ich glaube das ändert nichts am Problem selbst.
Ohne wirklich schon so weit zu sein definitive Aussagen zum Verhalten des gesammten Systems machen zu können, erwarte ich allerdings, dass es Phasen geben wird in denen die Queue gut gefüllt ist und somit alle Consumer beschäftigt sind. Es wird allerdings auch Phasen geben, in denen über längere Zeit keine Jobs in der Queue sind.
Angenommen ich hätte nun eine Lock freie Queue um im gefüllten Fall die beste Performance zu erzielen. Gibt es eine Möglichkeit die Consumer schlafen zu legen, falls die Queue leer ist, ohne, dass dabei der schnelle Pfad (also gefüllte Queue) beeinträchtigt wird und gleichzeitig sicher gestellt wird, dass kein Job der in die Queue gepusht wird verpasst werden kann?
Mein erster Gedanke war natürlich eine Condition Variable die von den Producern notified wird wenn ein neuer Job in der Queue liegt.
Allerdings kann es nun passieren, dass ein Consumer eine leere Queue sieht und entscheidet sich schlafen zu legen. Genau in diesem Moment und noch bevor der Consumer tatsächlich schläft legt nun ein Producer einen neuen Job in die Queue und ruft notify auf. Erst jetzt legt sich der Consumer tatsächlich Schlafen und hat somit den neuen Job verpasst. Mir scheint also nichts anderes übrig zu bleiben als die Queue mit einem Mutex zu schützen...
Gibt es da noch andere Ansätze? Hat das Problem vielleicht einen Namen unter dem man Papers und so zu dem Thema finden könnte? Ich verwende C++, bin aber eher generell an Lösungen interessiert.
ich experimentiere gerade etwas mit einem parallelen Job System herum. Mehrere Producer erzeugen Jobs die in einer Queue abgelegt, und dann von mehreren Consumern abgearbeitet werden. Streng genommen sind in meinem Fall die Producer und Consumer die gleichen Threads aber ich glaube das ändert nichts am Problem selbst.
Ohne wirklich schon so weit zu sein definitive Aussagen zum Verhalten des gesammten Systems machen zu können, erwarte ich allerdings, dass es Phasen geben wird in denen die Queue gut gefüllt ist und somit alle Consumer beschäftigt sind. Es wird allerdings auch Phasen geben, in denen über längere Zeit keine Jobs in der Queue sind.
Angenommen ich hätte nun eine Lock freie Queue um im gefüllten Fall die beste Performance zu erzielen. Gibt es eine Möglichkeit die Consumer schlafen zu legen, falls die Queue leer ist, ohne, dass dabei der schnelle Pfad (also gefüllte Queue) beeinträchtigt wird und gleichzeitig sicher gestellt wird, dass kein Job der in die Queue gepusht wird verpasst werden kann?
Mein erster Gedanke war natürlich eine Condition Variable die von den Producern notified wird wenn ein neuer Job in der Queue liegt.
Allerdings kann es nun passieren, dass ein Consumer eine leere Queue sieht und entscheidet sich schlafen zu legen. Genau in diesem Moment und noch bevor der Consumer tatsächlich schläft legt nun ein Producer einen neuen Job in die Queue und ruft notify auf. Erst jetzt legt sich der Consumer tatsächlich Schlafen und hat somit den neuen Job verpasst. Mir scheint also nichts anderes übrig zu bleiben als die Queue mit einem Mutex zu schützen...
Gibt es da noch andere Ansätze? Hat das Problem vielleicht einen Namen unter dem man Papers und so zu dem Thema finden könnte? Ich verwende C++, bin aber eher generell an Lösungen interessiert.