Valoarea de returnare a unui pthread_create (Programare, C, Pthreads)

onaclov2000 a intrebat.

Încerc să efectuez următorul apel,

PID = pthread_create(&t, NULL, schedule_sync(sch,t1), NULL);

schedule_sync returnează o valoare, aș dori să pot lua această valoare, dar din ceea ce am citit despre pthread_create, ar trebui să treceți o funcție „void”. Este posibil să obțin valoarea returnată de schedule_sync, sau va trebui să modific un fel de parametru transmis?

Vă mulțumesc pentru ajutor!

Comentarii

  • De asemenea, ar trebui să treceți un argument pentru rutina de pornire (schedule_sync în cazul dvs.). consultați acest exemplu amparo.net/ce155/thread-ex.html . Puteți crea o structură cu aceste două argumente sch și t1 –  > Por Kamal.
3 răspunsuri
Potatoswatter

pthread_create returnează un <errno.h> cod. Nu creează un nou proces, deci nu există un nou PID.

Pentru a trece un pointer la funcția dvs., luați adresa acestuia cu &.

pthread_create ia o funcție de forma void *func( void * ).

Deci, presupunând că schedule_sync este funcția firului,

struct schedule_sync_params {
    foo sch;
    bar t1;
    int result;
    pthread_t thread;
} args = { sch, t1 };

int err = pthread_create( &args.thread, NULL, &schedule_sync, &args );
 .....

schedule_sync_params *params_ptr; // not necessary if you still have the struct
err = pthread_join( args.thread, &params_ptr ); // just pass NULL instead
 .....

void *schedule_sync( void *args_v ) {
   shedule_sync_params *args = args_v;
   ....
   args->result = return_value;
   return args;
}

Comentarii

  • Îmi pare rău, schedule_sync face parte din proiectul gridlabd, de asemenea, tocmai am observat că PID a fost un nume prost pentru acea funcție de returnare, de fapt, verificam doar dacă a fost creat un PID (mai târziu în cod). Sunt conștient de faptul că firul este &t și ar trebui să fac un alt apel de funcție pentru a obține PID-ul real. Încă încerc să-mi dau seama dacă se poate obține o valoare de „return” dintr-o funcție transmisă. –  > Por onaclov2000.
  • Deci, acest lucru ar putea fi din cauza cunoștințelor mele limitate, dar dacă o funcție este nulă, poate să „returneze” arginții? de asemenea, cred că înțeleg unde vrei să ajungi cu asta, și se pare că ar funcționa dacă pot masa codul într-o formă similară, doar pentru a fi sigur că am înțeles modul în care am citit-o pthread_join înseamnă, în esență, să dai prioritate funcției transmise peste firul de apelare, (adică să te asiguri că unul face ceva de lucru imediat, în loc ca procesorul să își ocupe tot timpul cu „main”) –  > Por onaclov2000.
  • @onaclov: Nu este void deloc, ci returnează un void* care este convertibil în și din orice tip de pointer. pthead_join nu operează pe priorități, pur și simplu așteaptă până când celălalt fir de execuție a terminat și îți dă valoarea sa de întoarcere. –  > Por Potatoswatter.
  • Nu este necesar să folosiți un „&” explicit pentru a prelua adresa unei funcții; compilatorul o va face pentru dumneavoastră. –  > Por Daniel.
  • @Daniel Adevărat, dar oricum era nevoie de rescriere și, în general, stilul explicit este cel mai bun. –  > Por Potatoswatter.
Edy

Pentru a prinde valoarea de retur a firului copil în firul părinte (citit ca principal).

Trebuie să :

1) Să unești firele copil cu firul principal. Astfel încât firul principal să rămână și să aștepte ca firele copil să-și facă treaba și să iasă.

2) Să prindeți valoarea de întoarcere a firelor copil în timp ce ies. Firul copil trebuie să apeleze pthread_exit(&ret_val), unde ret_val conține valoarea de ieșire a funcției (pe care o executa firul copil).

Informații:

int pthread_join(pthread_t thread, void **rval_ptr);

void pthread_exit(void *rval_ptr);

Explicație:

*Funcția principală:*

După pthread_create, se alătură firului copil:

pthread_join(thread_id, (void**)&(p_ret_val_of_child_thread));

Funcția de procesare a firului copil:

  ret_val_of_child_thread = 10;

  pthread_exit(&ret_val_of_child_thread);
  } /* Child Thread Function Handler Ends */

Funcția principală: După terminarea executării firului copil, se poate prinde valoarea de întoarcere a acestuia în firul principal din „*(typecast valid *) *p_ret_val_de_fil_copil_thread”.

Cel de-al doilea argument al pthread_join conține valoarea de întoarcere a valorii de ieșire a gestionarului funcției child thread.

Comentarii

  • am încercat să vă formatez codul (nu prea reușit 😉 Vă rog să editați și să îmbunătățiți –  > Por kleopatra.
  • Mulțumesc mult ! Primul timer aici, nu mai aveam timp, nu am putut verifica toate Opțiunile deodată 🙂 –  > Por Edy.
Dennis Miller

schedule_sync ar trebui să returneze void* care poate fi orice. Puteți lua valoarea cu pthread_join.

//Function shoulde be look like this
void* schedule_sync(void* someStructureWithArguments);

//Call pthread_create like so
pthread_create(&t, NULL, schedule_sync, locationOfSomeStructureWithArguments);

Când se termină firul

pthread_joint(&t, locationToPutReturnValue);

Nu am un mediu de dezvoltare, așa că nu vă pot oferi încă secvența exactă, dar sper că acest lucru vă va ajuta să începeți.

Comentarii

  • Se pare că Potatoswatter mi-a luat-o înainte. –  > Por Dennis Miller.

Tags:,