Komunikace mezi vlakny

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Neděle Září 16 19:12:01 CEST 2007


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í.

> 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?

> 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ě.

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.

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.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."




Další informace o konferenci Linux