Passerer strukturer som argumenter ved bruk pthread_create ()

stemmer
17

Jeg prøvde å sende en struktur som fjerde argument mens du bruker pthread_create()med noe sånt som dette:

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

Nå når jeg prøver å få tilgang til variabler i strukturen - ta, tb eller tc, fortsetter jeg får en feilmelding - forespørsel om medlem i noe som ikke en struktur eller fagforening.

Hva alternativ metode kan jeg bruke til å passere structs inn i tråden?

Publisert på 14/05/2009 klokken 15:15
kilden bruker
På andre språk...                            


7 svar

stemmer
24

Du er sannsynligvis å skape struktur i samme omfang som pthread_create. Denne strukturen vil ikke lenger være gyldig en gang at omfanget er gått ut.

Prøv å lage en peker til strukturen på haugen og pass på at struktur peker til tråden din. Ikke glem å slette minnet et sted (i tråden om du aldri kommer til å bruke det igjen - eller når du ikke lenger trenger det).

Også, som cyberconte nevnt, hvis du skal aksessere dataene fra forskjellige tråder, må du låse tilgangen til det med en mutex eller kritisk delen.

Edit 14 mai 2009 @ 24:19 EST : Også, som andre har nevnt, må du kaste parameter til riktig type.

Hvis du sender en variabel som er en global struktur (som du synes å være insistere på), vil tråden funksjon må kaste til type:

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 */
}

Eller, hvis du passerer en peker til ditt struktur:

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 */
}
Svarte 14/05/2009 kl. 15:27
kilden bruker

stemmer
2

Hvis du er inne i tråden funksjon, argumentet du passerer er et tomrom *. Du må kaste den til en struct før du kan bruke den som sådan.

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 */
}
Svarte 14/05/2009 kl. 15:22
kilden bruker

stemmer
1
  1. Lag en semafor

  2. Lag en annen struktur som består av en peker til struktur og semafor håndtak

  3. Passere en peker til denne nye strukturen til pthread_create

  4. I den overordnede tråden, dvs. som kalte pthread_create, venter på semafor

  5. I barnet tråden, kopiere medlemmer av strukturen til lokale variabler eller lagre dem et annet sted

  6. I barnet tråden, signaliserer semafor

  7. I den overordnede tråden, lukker semafor

Svarte 15/05/2009 kl. 09:50
kilden bruker

stemmer
0

my_struct foo = (my_struct) (* arg); er incoreect prøve my_struct * foo = (my_struct *) (arg);
OG, int funksjonen Calling tråden, sørg for at den statiske (slik at minnet blir pekt på, er ikke tapt i tåke)

Svarte 25/07/2014 kl. 18:32
kilden bruker

stemmer
0

Jeg ofte brukt til å gjøre de samme feilene som er oppført i de andre svarene, men nå tar jeg en litt annen tilnærming som beveger seg potensialet for feil fra threading funksjon til pthread_create samtalen.

I erklære og definere gjenger funksjon i en 'normal' måte:

void *ThreadFunction(sPARAMETERS *Params) {

  // do my threading stuff...

}

og når jeg ringer pthread_create, jeg trenger å bruke en støpt:

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

Jeg nesten aldri glemme å bruke og på Params, og kompilatoren vil ta seg av eventuelle feilene jeg gjør på den andre enden. Fungerer bra for tilbakeanrop, også.

Svarte 14/05/2009 kl. 15:55
kilden bruker

stemmer
0

Denne feilmeldingen betyr at du ikke dereferencing pekeren.

Du sier "ta" i stedet for "t-> a"

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

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

        z = & y;
        za = 10;
}
[Meg @ myhost ~] $ cc -c testitx.c
testitx.c: I funksjon `hoved:
testitx.c: 10: error: forespørsel om medlem `en' i noe ikke en struktur eller union
[Meg @ myhost ~] $
Svarte 14/05/2009 kl. 15:34
kilden bruker

stemmer
0

Du kan bruke delt minne eller en global variabel, (om ikke annet må det argumentet) eller en Linked om disse er tråder som er fôring av data.

Bare husk å låse variabler som blir tråd delt.

Uten selve fornærmende skjønt, kan jeg ikke fortelle deg hva du gjør galt i din nåværende implementering.

Svarte 14/05/2009 kl. 15:21
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more