VS Aufgabe 2 - Runnable

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

VS Aufgabe 2 - Runnable
Serrrrrvus,

ich verstehe das mit dem Runnable nicht ganz.

class Runnable
{
    virtual void run() = 0;
};

Ich muss doch eine weitere Klasse erstellen, die von Runnable abgeleitet ist, und die run() implementiert.
Angenommen, ich will CommunicationSystem::send als eigenen Thread ausführen, wie sieht das denn aus?
Ich hätte gedacht, ich übergebe Thread() ein Funktionszeiger auf send, wie verpacke ich das als Klasse?


Antwortet mal bitte einer, sonst kann ich die Übung nicht fertigmachen :frowning:


Ich habe mich heute an die Aufgabe gemacht, scheitere aber schon an anderen prinzipiellen Sachen. Muss aber erst noch ueberlegen, wie ich diese prinzipiellen Fragen formuliere, scheint mir aber fast zu viel als Foren-Post :[…


lest euch halt mal die Folien dazu durch - run wird in Adapter implementiert.


Eine Threadimplementierung brauchst du natuerlich auch noch. Das muss eine Klasse sein, die irgendwie an ein Runnable Objekt rankommt und eine Methode (z.B. ‘start’) anbietet, die dann einen thread erzeugt und dort run() ausfuehrt.
Je nach Aufgabenstellung (die ich nicht kenn) brauchst du vielleicht noch synchronisationsmethoden.

Im send wird das dann vielleicht so ausschauen

{
SenderThread mySender = new SenderThread(msg, addr);
Thread newThread = new Thread(SenderThread);
newThread->start();
}

SenderThread ist was von Runnable abgelittenes, was eine run methode enthaellt, die msg nach addr schickt.
Thread ist eben die Threadimplementierung (wahrscheinlich nur auf pthreads abgebildet oder?)


Frag ruhig. Wer nicht fragt, bleibt dumm :wink:


Stimmt :gun:


Eine Frage noch zu Thread-Koordinierung:

Das ganze Mutex-Zeugs und

int pthread_cond_wait(pthread_cond_t *cond,
pthread_mutex_t *mutex);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);

Wo benutze ich denn das? Innerhalb eines Threads selbst (also in der Funktion, dessen Referenz ich pthread_create() übergeben habe), oder manage ich alle Threads im ‘eigentlichen Programm’ (im ‘Haupt-Thread’)?
Wenn Letzteres der Fall ist, wieso übergebe ich dann keinen Thread-ID an z.B. pthread_cond_signal()? Wenn ich zum Sperren keine ThreadID benutze, woher weiß ich dann, welcher Thread unterbrochen/aufgeweckt wird?


Ich denke mal zur Koordinierung im Hauptprogramm soll man die Klasse Semaphor benutzen. Die soll man dann für Unix mit dem pthread mutex implementiert werden.


Hmm, wie erklärt ihr euch dann, dass die Semaphoren Startwerte haben können? Ein Mutex wäre für mich eher was mit zwei Zuständen…


Mal was anderes:

in

void Thread::start(Runnable& client)
{

will ich meinen thread starten. Leider erwartet pthread_create
einen Funktionszeiger vom Typ void*()(void). Wie kann ich dieses Problem lösen?
Ich habe es mit C type casten versucht:
pthread_create(…, (void*()(void))client.run, …);

funktioniert aber nicht :wand:


Also die Semaphore kann man wohl nicht nur mit Mutexen implementieren, oder?

Nunja … hab aber erstmal ein Problem mit dem Runnable.

Meine Thread::start-Methode sieht so aus:

void Thread::start( Runnable& c ) {
        pthread_t tid;

        //c.run(NULL);
        pthread_create(&tid, NULL, c.run, NULL);
}

Die auskommentierte Zeile funktioniert mit all dem Adapterzeugs und sonstigen Brimborium … aber, wenn ich pthread_create aufrufe will er ja eine (void*) * (void *) haben … wie komme ich von “c.run” dorthin? Wahrscheinlich ganz einfach, aber mir will es nicht gelingen …


GEIL … DAS ist kein Zufall, Matthias :slight_smile:


Nein - das sind DIE ILLUMINATEN…


Tja, löst aber auch nicht das Problem


Nun, pthreads ist ne C Bibliothek. Demenstprechend müssen die Aufrufparameter C Signaturen haben. Ihr wollt dem pthread aber Zeiger auf C++ Methoden geben. Das geht so nicht.

Nachzulesen hier:

http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.2


Diese Übung geht mir langsam auf den Geist…


Danke Erik, das hat sehr geholfen … ich hab also eine statische Wrapperfunktion in meiner Threadklasse, die dann das run an der übergebenen Klasse ausführt … umständlich, aber funzt :slight_smile:


Semaphore mit Startwert 1 kann man auch als Mutex benutzen. Implementieren kann man das ganze dann mit Hilfe der pthread Mutex und der pthread Cond-Variable.