Processor-Algortihmus
-
Hmm..also den Algorithmus versteh' ich glaub schon.
Man hat Tasks in einer (globalen) queue. Jeder Prozessor wird dann einer Task zugeordnet. Wenn ein Prozessor nichts mehr zu tun hat, bekommt er eine nächste Task.
Die stealable tasks sind also einfach jene, die noch nicht bearbeitet wurden.Man müsste es wahrscheinlich schon manuell machen..allerdings fehlt mir hierzu wirklich der Ansatz (bzw. der Beginn..)
-
Das vorherige Problem hat sich erledigt - war wirklich keine grosse Sache

Aber bei der Methode hier:
/* Assigns the next task to this processor. First, all processors are checked for pending tasks. If a pending task is found, it is stolen from that processor and assigned to this processor. If there is no pending processor, the first task from tasks_ is assigned to this processor. */ void processor::assign_or_steal_task(std::queue<task*>& tasks_, std::vector<processor>& processors_) { std::cout << "[P" << _identifier << "] Assigning task. Pending tasks: "; for(std::deque<task*>::iterator t = _assigned_tasks.begin(); t != _assigned_tasks.end(); ++t) { std::cout << (*t)->get_identifier() << " "; } std::cout << std::endl; if(processor.get_pending_tasks() != NULL) { processors_.push_back(processor.get_stealable_task()); std::cout << "[P" << _identifier << "] Stole task 1 from processor 3" << std::endl; } else { processors_.push_back(tasks_.front()); std::cout << "[P" << _identifier << "] Stole task 1 from processor 3" << std::endl; } }stimmt etwas noch nicht so, wie es sollte.
Mein Compiler reklamiert wegen den zwei push_back s .
Woran liegt der Fehler, bzw. wie lässt sich dieser beheben?
-
du versuchst wohl nen task als prozessor zu speichern.ich vermute mal, dass das nicht funktioniert. Fehlermeldungen wären natürlich hilfreich um das rauszufinden.
-
Es hilft die FEHLERMELDUNG Wörtlich zu zitieren ... abgesehen davon schau dir mal was für typen deine vectoren enthalten und was die Methoden zurückgeben dann geht dir ein Task auf im Prozessor.
-
Die Fehlermeldung lautet:
\projects\assignment 3\a2\a2\processor.cpp(67): error C2059: Syntaxfehler: '.' \projects\assignment 3\a2\a2\processor.cpp(68): error C2143: Syntaxfehler: Es fehlt ';' vor '{' \projects\assignment 3\a2\a2\processor.cpp(69): warning C4832: Das Token '.' ist nach UDT 'processor' illegal \projects\assignment 3\a2\a2\processor.hpp(9): Siehe Deklaration von 'processor' \projects\assignment 3\a2\a2\processor.cpp(69): error C2275: 'processor': Ungültige Verwendung dieses Typs als Ausdruck \projects\assignment 3\a2\a2\processor.cpp(69): error C2228: Links von ".get_stealable_task" muss sich eine Klasse/Struktur/Union befinden. \projects\assignment 3\a2\a2\processor.cpp(72): error C2181: Ungültiges 'else' ohne zugehöriges 'if' \projects\assignment 3\a2\a2\processor.cpp(74): error C2664: 'void std::vector<_Ty>::push_back(_Ty &&)': Konvertierung des Parameters 1 von 'task *' in 'processor &&' nicht möglich 1> with 1> [ 1> _Ty=processor 1> ] 1> Ursache: Konvertierung von 'task *' in 'processor' nicht möglich 1> Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
-
Ich habe die Abfrage nun wie folgt geändert:
if(processor.get_pending_tasks() != NULL) { tasks_.push(processor.get_stealable_task()); //processors_.push_back(processor.get_stealable_task()); std::cout << "[P" << _identifier << "] Stole task 1 from processor 3" << std::endl; } else { tasks_.push(tasks_.front()); //processors_.push_back(tasks_.front()); std::cout << "[P" << _identifier << "] Stole task 1 from processor 3" << std::endl; }Allerdings immernoch mit der Fehlermeldung:
processor.cpp(67): error C2059: Syntaxfehler: '.' \processor.cpp(68): error C2143: Syntaxfehler: Es fehlt ';' vor '{' \processor.cpp(69): warning C4832: Das Token '.' ist nach UDT 'processor' illegal \processor.hpp(9): Siehe Deklaration von 'processor' \processor.cpp(69): error C2275: 'processor': Ungültige Verwendung dieses Typs als Ausdruck \processor.cpp(69): error C2228: Links von ".get_stealable_task" muss sich eine Klasse/Struktur/Union befinden. \processor.cpp(73): error C2181: Ungültiges 'else' ohne zugehöriges 'if'
-
Du hast die Klasse "processor" genannt, und verwendest jetzt diesen Bezeichner als Variablen-Namen. Wenn du auf das Objekt zugreifen willst, für das die Methode aufgerufen wurde, dafür gibt es this (also "this->get_stealable_task()" oder nur "get_stealable_task()" etc.). Wenn du ein auf ein anderes Objekt zugreifen willst, mußt du natürlich dieses angeben (z.B. "processors_[0].get_stealable_task()").
-
Ahh...

Besten Dank!
Hat funktioniert!
..jetzt muss ich nur noch schauen, wo ich keine Abbruchbedingung gemacht habe, denn das Programm läuft momentan noch endlos weiter..

-
Ihr seht den Fehler auch nicht, oder?
..dann muss ich den Fehler nämlich nicht bei diesen Funktionen suchen
-
Also in der angegebenen Funktion gibt es nur eine Schleife (die die freien Tasks ausgibt). Also liegt die Endlosschleife mit Sicherheit woanders. Wo, kann dir dein Debugger vermutlich ganz genau sagen.