Komunikace mezi pthread vlakny

Stanislav Meduna stano-cznews na meduna.org
Pondělí Březen 31 19:44:09 CEST 2003


On Mon, 31 Mar 2003 08:04:52 +0000 (UTC), [TJ] Pytt'l the Floyd wrote:

: Nakonec to vyresim pomoci pipe. Uz jsem ji rozjel. Ja sem myslel, ze se pro
: nove vlakno naduplikuje sama, takze kdyz jsemji zavrel v hlavnim, nejela
: v dcerinnem.

Pozor, pipe v Linuxe na madzithreadovu komunikaciu nie je
bohvieco. Problem je v tom, ze neprazdna pipa nikdy nie je
selektovatelna pre zapis.  Dovodom je, ze ma iba jednu stranku
miesta a zapisovatelna pipa musi garantovat, ze sa aspon
PIPE_BUF moze zapisat (a PIPE_BUF je jedna stranka).

Vysledkom je, ze ak si signalizujete medzi threadmi
cez pipu, tak sa writer nepohne, kym reader vsetko
neprecita - context switch thrashing ako vysity.

Pred vyse tromi rokmi som to hlasil na l-k aj s quick&dirty
patchom (vtedy proti 2.3.33), ale bolo mi odpovedane, ze sa
to mieni riesit inak (cielom bol zerocopy model). Na novych
jadrach som to neskusal, ale podla zbezneho pohladu
do pipe.c je to tak stale:

  if (PIPE_EMPTY(*inode))
     mask = POLLOUT | POLLWRNORM;

Koho to zaujima blizsie, grepnite si thready "nonempty pipe
does not select for write" z 26. 9. a 19. 12. 1999 a tiez
v tomto liste niekedy v tom septembri. Nasledne som tam
objavil este dalsi problem (pipe concurrent r/w performance
z 14. 7. 2000), ale to asi uz vyriesene je.

Zdravi
-- 
                                       Stano



Další informace o konferenci Linux