Raccolta di howto, informazioni, consigli, trucchi e documentazione di varia utilità per ricordare tante cose utili

martedì 17 novembre 2009

Eseguire un thread POSIX da C++

Per eseguire un thread POSIX dobbiamo chiamare la funzione
pthread_create(pthread_t *thread, const pthread_attr *attr, void *(*start_routine)(void *), void *arg)
Il problema nell'utilizzare questa cfunzione C in un programma C++ e che la funzione che deve essere eseguita dal nuovo thread
void * start_routine(void *arg)
deve essere una funzione C standard e non può dunque essere un metodo di una classe.
Per poter eseguire un metodo di uno specifico oggetto come nuovo thread, cosa che molto presumibilmente si vuole fare se si è deciso di utilizzare il C++, si deve utilizzare un piccolo trucco: si deve utilizzare una funzione C che richiama il metodo voluto.
In particolare supponiamo di voler richiamare il metodo Start dell'oggetto obj appartenete alla classe myClass ; si deve prima di tutto definire la funzione incaricata di avviare il thread
void * start_routine(void *p)
{
    myClass *pObj = (myClass *)p;
    pObj->Start();
    delete pObj;

    pthread_exit(NULL);
}
Nella funzione principale del programma (o dovunque si voglia far partire il nuovo thread) si deve inserire il seguente codice:
pthread_t pTh;
myClass *obj = new myClass();
obj->setParam(a, b, c);
pthread_create(&pTh, NULL, start_routine, (void *)obj);
Il metodo setParam può ovviamente essere un qualsiasi metodo utile per inizializzare lo stato dell'oggetto. La chiamata a delete dentro la start_routine è del tutto opzionale e serve esclusivamente se si vuole distruggere l'oggetto al terminare del thread.

Nessun commento: