Processor-Algortihmus



  • Hallo miteinander!

    Ich versuche gerade, die get_stealable_task() zu implementieren. Allerdings komm ich nicht weiter..zudem weiss ich auch nicht, ob das, was ich bisher gemacht habe, stimmt.

    Hier der cpp-Code:

    /* Returns and removes the next stealable task from this processor.
       If there is no stealable task, NULL is returned.
    */
    task* processor::get_stealable_task()
    {
       	long t = this->get_identifier();
    	long b = this->get_pending_tasks();
    	long size = b-t;
    	if(size <= 0)
    	{
    		return NULL;
    	}
    	//...
    }
    

    .hpp:

    #ifndef PROCESSOR_HPP
    #define PROCESSOR_HPP
    
    #include <queue>
    #include "task.hpp"
    
    class processor
    {
    private:
    	int _identifier;
    	std::deque<task*> _assigned_tasks;
    
    public:
    	processor(int identifier);
    
    	int get_identifier() const;
    	int get_pending_tasks() const;
    
    	task* get_stealable_task();
    	void finish_current_task();
    	void assign_or_steal_task(std::queue<task*>& tasks, std::vector<processor>& processors);
    	void assign_task(task* task);
    };
    
    #endif
    


  • Woran stellst du denn fest, ob ein task "stealable" ist? Wenn du das beantworten kannst, ist der Rest eigentlich ganz einfach: Du läufst einmal durch die Task-Liste und lieferst den esten Task zuück, der stealable ist (entweder manuell oder per std::find_if()).



  • 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.


Anmelden zum Antworten