Portál AbcLinuxu, 14. července 2025 11:51


Dotaz: pthreads - prosím o kontrolu

30.11.2009 10:12 tomas
pthreads - prosím o kontrolu
Přečteno: 390×
Odpovědět | Admin
Příloha:
Zdravím,

Jako programátor-samouk bych chtěl poprosit místní odborníky s následující situací: chci program který bude měnit data simultánně v několika vláknech, pak vlákna zastaví a provede nějakou souhrnnou operaci na všech datech, pak vlákna opět spustí a provede něco simultánně, a to celé se několikrát zopakuje.

Můj návrh programu je přiložen.

Program běží jak má, ale nejsem si jistý, jestli jsem tam nezapomněl nějakou náhodně se chovající chybu. Zejména si nejsem jistý, zda za ř. 54 nemůže dojít k nějaké nechtěné modifikaci mutexu či podmínky dřív, než řádek 118 zareaguje na signál poslaný před ř. 54.

Umí někdo říct, zda uvedené řešení je správně?

Díky.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

30.11.2009 14:43 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: pthreads - prosím o kontrolu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jak je to poskladano dohromady je to OK, rekl bych. Ale prijde mi to prilis komplikovane a neprehledne, pro zacatek bych doporucoval pouzit pthread_barrier_*.
30.11.2009 16:00 tomas
Rozbalit Rozbalit vše Re: pthreads - prosím o kontrolu
Díky, podívám se, co ten barrier umí.
30.11.2009 16:42 tomas
Rozbalit Rozbalit vše Re: pthreads - prosím o kontrolu
Příloha:
Ten barrier se opravdu celkem hodí, kód se zkrátil a zpřehlednil. Pokud by někdy někdo řešil podobný problém, přikládám upravený kód.
30.11.2009 18:57 Boris Dušek | skóre: 22 | blog: everything
Rozbalit Rozbalit vše Re: pthreads - prosím o kontrolu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jen poznámka k tomu cyklu "Do something", který má trošku zdržet - jelikož ani i, ani j se nepoužívají k žádnému dalšímu výpočtu ani jako parametry volání nějaké funkce, tak při nastavení optimalizace (třeba gcc -O2) kompilátor usoudí, že ten cyklus nic nemění a ten for cyklus vůbec do výsledného kódu nedá. Proto je třeba označit proměnné i,j jako "volatile", aby překladač bral každé čtení a zápis do i, j jako něco, co může mít vedlejší efekty (což je myslím definice "volatile" v C), a tím pádem i vliv na korektnost programu. Když jsem dal "volatile int i, j;", tak už tam ten for cyklus i při optimalizaci nechal.
vim ~/.emacs
30.11.2009 19:17 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: pthreads - prosím o kontrolu
Ještě lepší by samozřejmě bylo použít např. nanosleep().
30.11.2009 20:36 tomas
Rozbalit Rozbalit vše Re: pthreads - prosím o kontrolu
Jasně - já to zkoušel bez optimalizace; nakonec se mi ale stejně jako lepší generátor zdržení osvědčilo prostě spustit program v gdb a pomocí break pointu zarazit jedno vlákno, zatímco zbytek pokračoval (pomocí toho jsem odhalil pár prvních chyb).
3.12.2009 00:02 vencas | skóre: 32
Rozbalit Rozbalit vše Re: pthreads - prosím o kontrolu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Podívejte se na OpenMP. Na typy úloh, kde se OpenMP hodí, je kód pak o dost přehlednější, ale nevím, jestli je to váš případ. Mně to funguje výborně.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.