Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: pthreads [vyřešeno]  (Přečteno 2261 krát)

mizik

  • Návštěvník
  • Příspěvků: 72
    • mizici.com
pthreads [vyřešeno]
« kdy: 21 Května 2009, 21:48:59 »
Ahoj potreboval bych poradit.
Mam projekt c/c++, v nem pouzivam nekolik threadu, vyuzivam posix knihovnu pthreads. Main thread zpracovava vstup (stdin) a vytvari thready, ktere neco delaji. Vytvari je dokud na stdin nedetekuje EOF.
Na semaforu se mi uspi par threadu(cekaji na probuzeni jinymi thready) a pak se treba uzivatel rozmysli a zada do stdin EOF(nema je uz kdo probudit)

No a ted dotaz? Jak korektne probudit a ukoncit spici thready?
Mam pouzit pthread canceling? Ci poslat signal? nebo jak jinak na ne?  ???

Dik
« Poslední změna: 01 Června 2009, 05:32:04 od kiklhorn »

MacHala

  • Stálý člen
  • **
  • Příspěvků: 1104
  • Big Bro iz watching joo!
    • ZlejT
Re: pthreads
« Odpověď #1 kdy: 22 Května 2009, 10:26:15 »
s vlakny jsem tedy zatim nepracoval, ale neslo by to udelat tak, ze po EOFu s tim hlavnim nastavis nejakou globalni promenou, kterou budes v ostatnich vlaknech kontrolovat tesne za semaforem a pripadne koncit ; a pak v hlavnim vlaknu zjistis hodnotu semaforu a podle toho pak zavolas xkrat sem_post() ?

EDIT: jak jsem to po sobe cetl, tak mi to prijde jako celkem sileny souveti >> imho bude nejlepsi kdyz tem uzamcenym/uspanym vlaknum poodemykas/probudis z toho hlavniho vlakna (pomoci sem_post() )
« Poslední změna: 22 Května 2009, 23:56:38 od MacHala »
Prislusnik ligy, za kreativni pouzivani interpunkcnich znamenek, carek, predevsim.
=======================================
Tweetuju jako http://twitter.com/zl8

johniez

  • Návštěvník
  • Příspěvků: 81
    • http://www.johniez.com
Re: pthreads
« Odpověď #2 kdy: 24 Května 2009, 12:45:16 »
Na semaforu se mi uspi par threadu(cekaji na probuzeni jinymi thready) a pak se treba uzivatel rozmysli a zada do stdin EOF(nema je uz kdo probudit)

Urcite jde o semafor? Tam by se tohle nemelo resit - dojde k probuzeni cekajicich po uvolneni semaforu (sem_post) a pak by prece stacilo pockat na vsechna vlakna v mainu.

mizik

  • Návštěvník
  • Příspěvků: 72
    • mizici.com
Re: pthreads
« Odpověď #3 kdy: 24 Května 2009, 13:30:33 »
Predem diky vsem za odpoved.


Na semaforu se mi uspi par threadu(cekaji na probuzeni jinymi thready) a pak se treba uzivatel rozmysli a zada do stdin EOF(nema je uz kdo probudit)

Urcite jde o semafor? Tam by se tohle nemelo resit - dojde k probuzeni cekajicich po uvolneni semaforu (sem_post) a pak by prece stacilo pockat na vsechna vlakna v mainu.

No pokud se nepletu, tak semafor funguje jako mutex(ten je pouze binarni), tim myslim, pride mi thread do dane sekce a zvysi/snizi counter semaforu. Pokud jsem v < 0 hodnotach, tak se mi thread "uspi" a ceka na zvyseni semaforu(jinym threadem)...pokud jsou hodnoty kladne, tak normlane pokracuje dale..

No a ja mam ted "uspane" thready na semaforu a neni nikdo kdo by zvysil counter onoho semaforu(neresme ted proc se tak deje....)  Tak otazka znela, jak probudit tyto thready?
Jestli jak psal MacHala hlavni thread po detekci EOF projde seznam uspanych threadu a zvysi counter semaforu tolikrat kolik jich spi ci poslat nejaky jiny zpusob(canceling, signaly... )

Ptam se proto, ze nevim co je korektni vzhledem k filozofii praci s threadama.

Dik

mizik

  • Návštěvník
  • Příspěvků: 72
    • mizici.com
Re: pthreads
« Odpověď #4 kdy: 24 Května 2009, 13:31:26 »
s vlakny jsem tedy zatim nepracoval, ale neslo by to udelat tak, ze po EOFu s tim hlavnim nastavis nejakou globalni promenou, kterou budes v ostatnich vlaknech kontrolovat tesne za semaforem a pripadne koncit ; a pak v hlavnim vlaknu zjistis hodnotu semaforu a podle toho pak zavolas xkrat sem_post() ?

EDIT: jak jsem to po sobe cetl, tak mi to prijde jako celkem sileny souveti >> imho bude nejlepsi kdyz tem uzamcenym/uspanym vlaknum poodemykas/probudis z toho hlavniho vlakna (pomoci sem_post() )

Ok, dik. Zatim me nic lepsiho nenapada.

johniez

  • Návštěvník
  • Příspěvků: 81
    • http://www.johniez.com
Re: pthreads
« Odpověď #5 kdy: 24 Května 2009, 21:31:19 »
Vlakna co spi nemaj dokoncit svoji praci? Jestli ne, tak bych je klidne zabil pres pthread_cancel.
Jestli ano, tak nevidim duvod proc to zeslozitovat:

Main: vytvoreni thread_1, thread_2
thread_1 zamkne semafor
thread_2 se uspi na semaforu
Main: prijde EOF, ceka na dokonceni vsech dosud vytvorenejch vlaken
thread_1 dokonci praci a odemkne semafor
thread_2 je vpusten na semaforu a dela praci do konce, odemkne semafor
Main: vsechna vlakna dobehla, konec

mizik

  • Návštěvník
  • Příspěvků: 72
    • mizici.com
Re: pthreads
« Odpověď #6 kdy: 31 Května 2009, 15:37:12 »
Ok, dik vsem za rady  :)

 

Provoz zaštiťuje spolek OpenAlt.