Domanda

Ho provato a passare una struttura come il quarto argomento durante l'utilizzo di pthread_create() con qualcosa di simile:

pthread_create(&tid1, NULL, calca, &t); //t is the struct

Ora ogni volta che provo ad accedere alle variabili nella struttura - t.a, t.b o t.c, continuo a ricevere un errore -. Richiesta di membro in qualcosa non una struttura o unione

Quale metodo alternativo potrei usare per passare le strutture nella filettatura?

È stato utile?

Soluzione

Probabilmente vi state creando la struttura nella stessa portata di pthread_create. Questa struttura non sarà più valida una volta che si esce dalla portata.

Provare a creare un puntatore alla struttura sul mucchio e superare tale puntatore struttura al tuo thread. Non dimenticare di cancellare quella memoria da qualche parte (nel thread, se non verrà mai usata di nuovo - o quando non è più necessario).

Inoltre, come accennato cyberconte, se avete intenzione di essere l'accesso ai dati che da diversi thread, è necessario per bloccare l'accesso ad essa con un mutex o di sezione critica.

Modifica 14 maggio 2009 @ 12:19 EST : Inoltre, come altre persone hanno già detto, si deve lanciare la vostra parametro per il tipo corretto.

Se si passa una variabile che è una struttura globale (che ti sembra di essere insistendo su), la funzione filo dovrà lanciare al tipo:

void my_thread_func(void* arg){
    my_struct foo = *((my_struct*)(arg)); /* Cast the void* to our struct type */
    /* Access foo.a, foo.b, foo.c, etc. here */
}

In alternativa, se si passa un puntatore alla struttura:

void my_thread_func(void* arg){
    my_struct* foo = (my_struct*)arg; /* Cast the void* to our struct type */
    /* Access foo->a, foo->b, foo->c, etc. here */
}

Altri suggerimenti

Se siete all'interno della vostra funzione di filo, l'argomento si passa è un void *. Avrete bisogno di lanciare ad una struct prima di poter utilizzare come tale.

void my_thread_func(void* arg){
    my_struct foo = (my_struct)(*arg); /* Cast the void* to our struct type */
    /* Access foo.a, foo.b, foo.c, etc. here */
}
  1. Crea un semaforo

  2. Crea un'altra struttura che si compone di un puntatore per la struttura e la maniglia del semaforo

  3. passare un puntatore a questa nuova struttura a pthread_create

  4. Nel thread genitore, vale a dire che ha chiamato pthread_create, attendere sul semaforo

  5. Nel thread figlio, copiare i membri della vostra struttura a variabili locali o salvarli altrove

  6. Nel thread figlio, segnalare il semaforo

  7. Nel thread genitore, chiudere il semaforo

Si potrebbe utilizzare la memoria condivisa o una variabile globale, (se non altro avrà bisogno di tale argomento) o un LinkedList se queste sono le discussioni che si nutrono dei dati.

Basta ricordarsi di bloccare le variabili che vengono filo-condivisa.

Senza il codice incriminato attuale, però, non posso dirvi quello che stai facendo male nella vostra implementazione corrente.

Questo messaggio di errore significa che non siete dereferencing il puntatore.

Stai dicendo "t.a" invece di "t-> un"

[me@myhost ~]$ cat testitx.c
struct x {
        int a, b;
};

int main(int argc, char *argv[])
{
        struct x y, *z;

        z = &y;
        z.a = 10;
}
[me@myhost ~]$ cc -c testitx.c
testitx.c: In function `main':
testitx.c:10: error: request for member `a' in something not a structure or union
[me@myhost ~]$

Mi capita spesso usato per fare gli stessi errori elencati nelle altre risposte, ma ora mi prendo un approccio leggermente diverso che muove il potenziale di errore dalla funzione di filettatura alla chiamata pthread_create.

Dichiaro e definire la funzione di filettatura in modo 'normale':

void *ThreadFunction(sPARAMETERS *Params) {

  // do my threading stuff...

}

e quando chiamo pthread_create, ho bisogno di usare un cast:

pthread_create(&ThreadId,0,(void*(*)(void*)) &ThreadFunction,&Params);

Non ho quasi mai dimenticare di usare il & sulle Params, e il compilatore prenderò cura di eventuali errori che faccio su l'altra estremità. Funziona alla grande per le richiamate, anche.

my_struct foo = (my_struct) (* arg); è incoreect provare my_struct * foo = (my_struct *) (arg);
E, int la funzione di chiamata il filo, assicurarsi che la sua statica (quindi la memoria viene puntato, non è perso nella nebbia)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top