PDA

Visualizza la versione completa : [C] Più argomenti nella funzione in pthread_create


fkiller84
05-10-2005, 11:48
Salve a tutti sono nuovo sul forum intanto vi saluto:-)! Scusate la banalità del mio problema ma sono alle prime armi con il C... Comunque....
Dunque ho un problema di programmazione C, sto progettando per l'università un programma dal titolo "bacheca virtuale", basato su architettura client-server. Il server inoltre è implementato in multithreading. Vengo al mio problema:

Per creare i thread utilizzo naturalmente la funzione pthread_create, la quale accetta come parametri: l'ID del thread creato, la funzione da far eseguire al thread, e un campo "ARG" in cui specificare gli ARGOMENTI da passare alla predetta funzione. Il problema è che il campo "ARG" è uno solo, mentre la funzione che dovrei far eseguire al thread dovrebbe avere PIU' di un argomento (dovrebbe essere cioè del tipo
funzione(argomento1, argomento2) ).

Come posso fare? Specificando più argomenti separati da virgole nella pthread_create mi da errore di "too many arguments", e ho provato di tutto senza riuscire...
Grazie mille in anticipo!

oregon
05-10-2005, 12:25
Crea una struttura con tutti i tuoi argomenti e passa il puntatore alla struttura.

LeleFT
05-10-2005, 13:47
Esatto.
L'ultimo argomento arg è un puntatore void. Puoi, quindi, passargli un puntatore a qualsiasi cosa (come una struttura, un array,...).


Ciao. :ciauz:

fkiller84
05-10-2005, 14:12
Il probl è che i vari argomenti sono di tipo diverso (un intero, una stringa e un tipo messaggio definito da me), quindi un array non va bene...
Provo a definirmi una nuova struttura allora, vedo se riesco così...

Grazie mille :-)!!!

fkiller84
05-10-2005, 14:38
Dunque, invece di creare una struttura e incasinare un po' le cose in questo modo, ho risolto il tutto creando il thread PRIMA e poi lanciando la funzione da fargli eseguire.

Soltanto che ora mi da un problema di "segmentation fault" e ho pensato potesse derivare dal fatto che ora la mia pthread_create è nella forma

pthread_create(&threadID, NULL, NULL, NULL)

Probabilmente è sbagliato dare il vaolre NULL al terzo argomento. Ma quindi se voglio che il thread appena creato esegua semplicemente il codice seguente alla chiamata pthread_create, come devo fare?
Grazie!!!

oregon
05-10-2005, 15:04
Non puoi indicare come NULL il puntatore alla funzione da eseguire alla creazione del thread.

E non ho capito come hai risolto con la questione dell'argomento ... se passi il puntatore NULL non passi alcun argomento ...

Ma poi che vuol dire che il thread appena creato deve eseguire il codice seguente ?? Un nuovo thread esegue il proprio codice indicato dalla funzione da cui parte ... quello corrente continua ad eseguire il codice corrente ...

fkiller84
05-10-2005, 15:24
Scusami è che sono davvero alle prime armi con il C e sono incapace anche a spiegarmi:-)....
Allora ti spiego il mio problema per bene: ho questo server che comunica con i vari client con le code di messaggi (msgget e robe simili). Ho messo quindi un ciclo while(1) all'interno del quale eseguo la chiamata di ricezione dei messaggi msgrcv.


A questo punto io creo un thread.
A seconda poi del tipo di messaggio che ricevo (la struttura messaggio da me creata ha un campo type) vorrei che questo thread eseguisse una specifica funzione.

Nell'implementazione precedente avevo messo le funzioni specifiche all'interno del campo funzione della pthread_create, con i problemi di cui ho parlato prima. Allora avevo pensato di creare un thread indifferentemente dal tipo di funzione da fargli eseguire, e poi di differenziare attraveso uno switch la funzione da fargli compiere.
In questo secondo modo però i thread dovrebbero tutti eseguire il codice del programma corrente senza richiamare nessuna funzione: ecco quindi il mio problema!!

Spero di essermi spiegato un po' meglio:-)...

unomichisiada
05-10-2005, 16:32
Originariamente inviato da fkiller84
Scusami è che sono davvero alle prime armi con il C e sono incapace anche a spiegarmi:-)....
Allora ti spiego il mio problema per bene: ho questo server che comunica con i vari client con le code di messaggi (msgget e robe simili). Ho messo quindi un ciclo while(1) all'interno del quale eseguo la chiamata di ricezione dei messaggi msgrcv.


A questo punto io creo un thread.
A seconda poi del tipo di messaggio che ricevo (la struttura messaggio da me creata ha un campo type) vorrei che questo thread eseguisse una specifica funzione.

Nell'implementazione precedente avevo messo le funzioni specifiche all'interno del campo funzione della pthread_create, con i problemi di cui ho parlato prima. Allora avevo pensato di creare un thread indifferentemente dal tipo di funzione da fargli eseguire, e poi di differenziare attraveso uno switch la funzione da fargli compiere.
In questo secondo modo però i thread dovrebbero tutti eseguire il codice del programma corrente senza richiamare nessuna funzione: ecco quindi il mio problema!!

Spero di essermi spiegato un po' meglio:-)...
Secondo me stai cercando sotterfugi strani e confido che non riuscirai nmmeno nel tuo intento così. Siccome non l'ho mai sentita thread_create presumo si usi sotto linux, comunque io ho programmato con i thread in c sotto windows ed ho usato una funzione analoga a cui i parametri li dovevo passare mediante puntatore a struttura. La funzione è stata concepita per essere usata così e tu così la devi usare, cercare altre strade mi sembra pionieristico specialmente per uno inesperto di c. Ti suggerisco caldamente di fare come ti hanno suggerito quindi: ti crei una struttura, ci carichi i dati dei tipi che ti servono (non vedo il problema nel farlo), la passi per riferimento a create_thread con &nomeVariabileDiTipoMiaStruttura nel quarto parametro. Quando poi ti serve utilizzare i parametri fai un cast del puntatore a void a puntatore di tipo MiaStruttura* e accedi ai campi con l'operatore freccia ->

oregon
05-10-2005, 16:39
Pur avendolo spiegato, considera che il problema lo hai tutto chiaro tu e io non posso capirlo in maniera completa ...

Se ti serve il multithreading e' perche' vuoi eseguire (diciamo) del codice in maniera concorrente ... Se il compito di ogni thread e' quello di servire un client (ma non mi pare il tuo caso) allora passi ad ogni thread creato le informazioni (con il puntatore a struttura) che gli servono ... Se il compito e' quello di elaborare un particolare messaggio per ogni client, allora passi solamente queste informazioni ...

Loading