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