Komunikace mezi vlakny
Dalibor Straka
dast na panelnet.cz
Neděle Září 16 20:34:45 CEST 2007
Ahoj!
On Sun, Sep 16, 2007 at 07:12:01PM +0200, Pavel Kankovsky wrote:
> On Sat, 15 Sep 2007, Dalibor Straka wrote:
>
> > mam program pouzivajici pthread a potrebuji udelat hack, aby jedno
> > vlakno mohlo poslat zpravu vsem ostatnim vlaknum. Coz se prostredkama
> > sdilene pameti prilis dobre nedela.
>
> Záleží kolik dat a kolika přijemcům chcete posílat. Pokud je součin velké
> číslo, pak je sdílená paměť (kde to stačí napsat jednou a ne v N kopiích)
> celkem žádoucí.
>
Kamen urazu je, ze nepoznam, zda-li si vsechna vlakna vzkaz vyzvedla.
Hodne dynamicky vznikaji a zanikaji.
> > Zprava musi zustat aktivni dokud si ji nevybere posledni vlakno, ktere
> > se navic muze seknout pri vypadku site.
>
> A když se sekne napořád, tak mají zprávy někde viset také napořád?
>
Kontrola vlaken zatim neni implementovana. Do doby, nezli byla potreba
nejaka slozitejsi komunikace, jsem se o vlaka vubec nestaral. Jsem
zvykly od deti.
> > Uvazoval jsem o pipe() nebo o sys/ipc.h a sys/msg.h. Co byste
> > doporucili?
>
> Pokud jsou na výběr tyto dvě možnosti, pak roury. SysV IPC je dost, ehm,
> no, divné. I když jeho inovace v poslední verzi Posixu vypadají zajímavě.
>
Uz jsem vse naimplementoval pres pipe(). Dokonce druha verze. Vcera do
sesti rano jsem delal prvni nastrel a kdyz jsem se probudil, tak jsem
komunikaci celou prepsal. Zajimalo by me o cem se mi v noci zdalo.
> Nevýhoda je, že je tam hodně syscallů. I když dost záleží na tom, jak
> často by se stávalo, že vlákno bude čekat na zprávu.
>
U zprav nezalezi na poradi ani na zpozdeni vyzvednuti (treba i
o hodinu), a presto se tim implementace nezjedodusi. Naopak zesloziti,
protoze nevim, jestli si zpravu vsichni uz vybrali.
> Dala by se udělat jakási páska (nejspíš pospojovaná z větších dynamicky
> alokovaných bloků), kde by se na jednom konci zapisovaly nové zprávy a od
> druhého konce by si je každé vlákno svým tempem četlo. Nějaká uklízečka by
> občas zkontrolovala, jak jsou jednotlivá vlákna daleko se čtením a
> recyklovala by už nepotřebné části pásky. Dalo by se to udělat se
> zamykáním pouze při vysílání a možná nějakou tou condition variable,
> pokud by čtenáři měli mít možnost čekat na příchod nové zprávy.
>
Programek zatim nema zadny "thread management" ani heart-beat.
Komunikaci pres Pipe() jsem pouzival pri forkovanych vetvich a zdalo se
mi divne pouzivat pipe() a poll() ve vlaknech, ktera maji jine moznosti
komunikace. Zajimalo me, jestli mi neunika nejaka genialni metoda
komunikace, kterou vsichni pouzivaji. Vlastnich jsem si vymyslel
nekolik a jsou +- stejne tezke na implementaci. Na kazdeho klienta jsou
dve vlakna receiver()/sender(), pak uz jen pevny pocet vzdy pritomnych
vlaken pro screen() update, io() a nejake notifikace().
Libila se mi samostatnost vlaken, ktera se hezky postaraji samy o sebe.
Vidim, ze jsem se mylil.
Opet diky za cenne rady!
-- Dalibor Straka
Další informace o konferenci Linux