Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] Più argomenti nella funzione in pthread_create

    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!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Crea una struttura con tutti i tuoi argomenti e passa il puntatore alla struttura.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Esatto.
    L'ultimo argomento arg è un puntatore void. Puoi, quindi, passargli un puntatore a qualsiasi cosa (come una struttura, un array,...).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    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 :-)!!!

  5. #5
    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!!!

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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 ...

  7. #7
    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:-)...

  8. #8
    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 ->
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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 ...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.